簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM