C#使用Activator.CreateInstance工厂模式如何

时间:2011-10-21 00:36:12

标签: c# asp.net-mvc design-patterns factory-pattern

我有用户类说,用户

public class User
{
public int Id {get;set;}   
public string Name {get;set;}

}

以及通过查看给定用户的Id

返回一组用户的界面
public intervace IPeople
{
   IList<User> GetPeople (int id);
   string Key {get;}
}

以下是IPeople的几个实现

public class Friends : IPeople
{
   public IList<User> GetPeople (int id)
   {
      return ListOfUsersWhoAreFriends();
   }

    public string Key {get { return "Friends"; }
}


public class Fans : IPeople
{
   public IList<User> GetPeople (int id)
   {
      return ListOfFans();
   }
   public string Key {get { return "Fans"; }

}

现在我的调用方法

 string key="SomeKey" ; //It could be friends or fans
 int id =1;
 IPeople[] allPeople = GetAllInstancesOf<IPeople>();

 IList<User> requiredUsers = allPeople.FirstOrDefault(m=>m.Key == key).GetPeople(id);

所以说,我创建了所有派生类的实例,然后检查我需要哪一个, 在我调用函数之前。它的工作正常,但我觉得,从性能的角度来看 看,它不是一个很好的解决方案,因为我通过反射创建实例。实现它的更好方法是什么。一些工厂方法如果是,怎么做?

帮助将不胜感激。

此致

成员Parminder

2 个答案:

答案 0 :(得分:2)

我猜你在GetAllInstancesOf类中使用反射?不确定您填写人员列表的位置或者您需要密钥和ID的原因,但对于此实例中的工厂模式,我将使用以下内容

public IList<User> UserFactory(string kindOfPeople)
{
  switch (kindOfPeople.ToLower())
  {
    case "fans":
      return ListOfFans();
    case "friends":
      return ListOfUsersWhoAreFriends();
    default:
      return new List<User>();
  }
}

如果人们(粉丝,朋友,家人等)的种类有限并且在您的申请中不经常更改,那么我会将其作为枚举并将其传递到工厂

public enum KindsOfPeople { Friends = 0, Fans = 1}

PS:这假设Fans和Friends都来自User类。这未在您的代码中显示。使用工厂模式的一种好方法是,从工厂返回的所有可能的类都继承自公共基类。

答案 1 :(得分:0)

我觉得,我找到了更好的解决方案。在这里。

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public interface IPeople
{
    IList<User> GetPeople(int id);

}


public class Friends : IPeople
{
    public IList<User> GetPeople(int id)
    {
        return new List<User>();
    }



    public class Fans : IPeople
    {
        public IList<User> GetPeople(int id)
        {
            return new List<User>();
        }
    }


    public class Program
    {
        static void Main(string[] args)
        {
            var builder = new ContainerBuilder();
            builder.RegisterType<Friends>().Named<IPeople>("Friends");
            builder.RegisterType<Fans>().Named<IPeople>("Fans");

            IContainer c = builder.Build();

            var x = c.ResolveNamed<IPeople>("Friends");

        }
    }
}

当我使用Autofac时,我使用命名键来查看寄存器。

由于