c#使用激活器.如何创建工厂模式

本文关键字:创建 工厂 模式 何创建 激活 | 更新日期: 2023-09-27 18:11:48

我有一个用户类,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;}
}

以下是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

c#使用激活器.如何创建工厂模式

我猜你在你的GetAllInstancesOf类使用反射?不确定从哪里填充People列表,也不确定为什么需要键和Id,但对于本例中的工厂模式,我将使用以下

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

如果人的种类(粉丝,朋友,家人等)是有限的,并且在你的应用程序中不经常改变,那么我会把它变成一个enum并传递给工厂

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

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

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

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时,我用命名键来照看寄存器。

谢谢