[英]C# Using Activator.CreateInstance factory pattern how to
我有用戶類說,用戶
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
我猜你在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類。 這未在您的代碼中顯示。 使用工廠模式的一種好方法是,從工廠返回的所有可能的類都繼承自公共基類。
我覺得,我找到了更好的解決方案。 在這里。
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時,我使用命名鍵來查看寄存器。
謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.