C # Использование Activator.CreateInstance заводской шаблон, как - PullRequest
0 голосов
/ 21 октября 2011

У меня есть класс пользователя, скажем, User

public class User
{
public int Id {get;set;}   
public string Name {get;set;}

}

и интерфейс, который возвращает группу пользователей, глядя на идентификатор данного пользователя

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

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

Я предполагаю, что вы используете отражение в своем классе 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: Это предполагает, что оба вентилятораи Друзья происходят из класса User.Это не было показано в вашем коде.Хороший способ использования фабричного шаблона - это если все возможные классы, возвращаемые фабрикой, наследуются от общего базового класса.

0 голосов
/ 21 октября 2011

Мне кажется, я нашел лучшее решение. Здесь это идет.

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, я слежу за регистром с именованными ключами.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...