WPF / Prism: Что такое контейнер UNITY? - PullRequest
28 голосов
/ 06 января 2011

Может кто-нибудь объяснить мне понятие контейнера Unity, как будто я 6-летний ребенок? Как это работает и что делает?

Ответы [ 3 ]

51 голосов
/ 06 января 2011

Это более техническое описание фона, надеюсь, вы по-прежнему найдете его полезным.

Обычно это контейнер DI (внедрение зависимостей).

Дан следующий класс:

public class Sample
{
  Service a;

  public Sample()
  {
    a = new Service();
  }
}

Проблема в том, что он инициализирует свою собственную версию Service, что делает его очень трудным для адаптации к изменениям кода (т. Е. Если вы хотите заменить Service на что-то другое). Также это затрудняет тестирование.

Чтобы решить эту проблему, на самом деле не создавайте его самостоятельно, а получите его извне:

public class Sample
{
  Service a;

  public Sample(Service aService)
  {
    a = aService;
  }
}

Теперь вы забрали создание из класса, вы можете просто поместить его туда снаружи, что повышает тестируемость и ремонтопригодность. Однако у вас все еще есть зависимость от класса Service. Вы на самом деле не заинтересованы в этом конкретном классе, но в поведении, которое он предлагает - поэтому вы делаете из него интерфейс.

public class Sample
{
  IService a;

  public Sample(IService aService)
  {
    a = aService;
  }
}

Теперь вы можете заменить услугу на что угодно. Например, у вас есть класс, получающий данные с сервера с помощью службы. Теперь вы хотите протестировать только парсинг данных, а не сервис извлечения данных - просто создайте класс, реализующий интерфейс, обслуживающий статические данные, - готово!

Теперь в игру вступает Unity. На данный момент вы должны разрешить зависимости самостоятельно. Единство делает просто - оно берет все классы, которые имеют зависимости, и разрешает их - так что вы можете просто вызвать (псевдокод, я не знаю единство):

UnityContainer uc = new UnityContainer();
var a = uc.GetService<IService>();

И это дает вам готовый к использованию класс.

Чего мы достигли этим?

  • код более удобен в обслуживании, поскольку вы не полагаетесь на определенные типы
  • код более тестируемый
  • приложение легко расширяется

В заключение: это помогает быстрее создавать лучшие приложения.

36 голосов
/ 06 января 2011

Unity Container похож на банку с печеньем, когда вам нужен файл cookie, просто попросите банку дать вам файл cookie.

Каждое печенье имеет некоторые достоинства, например, что вы можете иметь печенье, но вы не можете его съесть, потому что его очень трудно есть (что-то вроде синглтона)

когда твоя мама создает новое печенье, она просто кладет это печенье в банку, а не дает тебе напрямую!

7 голосов
/ 06 января 2011

Я рекомендую вам посмотреть Видеосериал Майка Таулти "Prism"

Первые две главы ответят на ваш вопрос, а вы можете посмотреть другие главы, чтобы изучить Prism (хотя его версия 2довольно старый, основные принципы остаются прежними ...)

Удачи:)

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