我有用户类说,用户
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
答案 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时,我使用命名键来查看寄存器。
由于