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

C#使用Activator.CreateInstance工厂模式如何,c#,asp.net-mvc,design-patterns,factory-pattern,C#,Asp.net Mvc,Design Patterns,Factory Pattern,我有一个用户类,比如说,user 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;} } public intervace IPeople { IList G

我有一个用户类,比如说,user

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;}
}
public intervace IPeople
{
IList GetPeople(int-id);
字符串键{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"; }

}
公共课好友:IPeople
{
公共IList GetPeople(int id)
{
返回ListofUswHoaRefriends();
}
公共字符串密钥{获取{返回“朋友”;}
}
公开课粉丝:IPeople
{
公共IList GetPeople(int id)
{
返回listofans();
}
公共字符串密钥{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);
string key=“SomeKey”//可能是朋友或粉丝
int-id=1;
IPeople[]allPeople=GetAllInstancesOf();
IList requiredUsers=allPeople.FirstOrDefault(m=>m.Key==Key.GetPeople(id);
也就是说,我创建所有派生类的实例,然后检查我需要哪一个, 在我调用函数之前,它工作得很好,但我觉得,从性能的角度来看 视图,这不是一个很好的解决方案,因为我通过反射创建实例。实现它的更好方法是什么。一些工厂方法如果是,如何

我们将不胜感激

问候


Parminder

我猜您在GetAllInstancesSof类中使用了反射?不确定从何处填充人员列表,或者为什么需要密钥和Id,但对于本例中的工厂模式,我将使用以下命令

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

PS:这假设粉丝和朋友都来自用户类。这在您的代码中没有显示。使用工厂模式的一个好方法是,如果从工厂返回的所有可能的类都继承自一个公共基类。

我觉得,我找到了一个更好的解决方案。现在开始

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");

        }
    }
}
公共类用户
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
公共接口IPeople
{
IList GetPeople(int-id);
}
公共课朋友:IPeople
{
公共IList GetPeople(int id)
{
返回新列表();
}
公开课粉丝:IPeople
{
公共IList GetPeople(int id)
{
返回新列表();
}
}
公共课程
{
静态void Main(字符串[]参数)
{
var builder=new ContainerBuilder();
builder.RegisterType().Named(“Friends”);
builder.RegisterType()。命名为(“Fans”);
IContainer c=builder.Build();
var x=c.c.(“朋友”);
}
}
}
当我使用Autofac时,我会用指定的密钥管理寄存器


谢谢

谢谢柴坦尼亚,但我不喜欢这里的Ifs、开关和枚举。想想看,如果我想创建新类型的人,需要再次更改代码。@Parminder你认为你的Autofac答案中发生了什么?各种Ifs、开关和哈希表等。你只是从中删除。有了Autofac答案,你就可以无论如何,当你必须创建一个新类型时,你必须更改代码。如果你想避免这种情况,你应该使用一个配置文件注册这些类。不确定Autofac,但确定其他一些DI(依赖项注入)像Spring.Net这样的容器将允许您在代码和配置两方面进行操作。@LarsTech感谢您的反馈。我能理解您的意思。但至少我在后期使用一些配置文件进行配置。此外,如果我最终使用Autofac所做的相同操作,那么最好使用它,而不是重新发明它。我不知道autofac所以说不出它在做什么,但很有可能每次调用ResolveNamed时,它仍会使用反射为给定的
IPeople
实现创建一个新实例。因此,如果您担心性能,您只是隐藏了问题。在您实际进行任何与性能相关的更改之前,您应该测量实例化一个对象不会花费太多(特别是在构造函数中没有工作的情况下)。@marcind谢谢,我知道它是隐藏的,但我觉得在这个阶段我可以依赖它,我会看看我是否能在其他阶段做得更好。
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");

        }
    }
}