Unity 2.0 Пояснение пожалуйста

Может ли кто-нибудь помочь мне понять, что такое Unity и как он упрощает кодирование в примере ниже:

Обычный код

FileLogger myLogger = new FileLogger();
FileLogger myLogger = new FastLogger();

Код контейнера Unity

// Create container and register types
IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<ILogger, FileLogger>();       // default instance
myContainer.RegisterType<ILogger, FastFileLogger>("FastLogger");
ILogger myLogger = myContainer.Resolve<ILogger>();

Также:

  1. Что такое контейнер в Unity?
  2. Что такое Resolve?
  3. Что такое RegisterType.
  4. Что подразумевается под отображением типов?
  5. Что такое МОК

Также, что произойдет, если два класса реализуют один и тот же интерфейс, и мы сделаем что-то подобное в Unity:

container.RegisterType<IInvoicingService, InvoicingService>()
         .RegisterType<IInvoicingService, ManagerService>();
IInvoicingService service = container.Resolve<IInvoicingService>();
service.GetCount();

Похоже, он вызовет метод getCount на ManagerService. Что мне делать, чтобы вызвать GetCount на InvoicingService и ManagerService?

Да, я читал документацию по CodePlex, это меня сильно сбило с толку!


person Nil Pun    schedule 26.08.2011    source источник
comment
Вам может помочь следующий ответ: stackoverflow.com/questions/4612054/   -  person Christophe Geers    schedule 26.08.2011


Ответы (2)


Для IOC и / или внедрения зависимостей я могу порекомендовать это прочитать:

http://martinfowler.com/articles/injection.html

Это должно помочь вам лучше понять, чего вы можете достичь, используя эти шаблоны. Unity помогает реализовать эти шаблоны в .NET.

Я постараюсь ответить на ваши вопросы из списка, насколько мне известно:

  • Ваш Контейнер - это всего лишь контейнер. Он предназначен для хранения ваших сопоставлений.
  • «Разрешить» разрешает ваш интерфейс в конкретный экземпляр реализации этого конкретного интерфейса. Однако вы будете работать только с этим интерфейсом, поэтому реализация будет заменяемой (что является основной причиной для всего этого)
  • «RegisterType» обычно позволяет вам зарегистрировать конкретный класс для интерфейса. Таким образом, вы в основном говорите: «Это интерфейс, и если кто-то запрашивает разрешение этого интерфейса, верните экземпляр этого конкретного класса». Как видите, у вас может быть значение по умолчанию с именем Type Mappings.
  • Отображение типов - это отображение между интерфейсом и реализацией.
person Community    schedule 26.08.2011
comment
Спасибо @UrbanEsc, оцените это. Я добавил еще один вопрос к своему исходному вопросу. - person Nil Pun; 26.08.2011
comment
@flybyte, чтобы ответить на ваш добавленный вопрос: вы перезаписываете зарегистрированный тип по умолчанию, не передавая аргумент для вашего второго вызова RegisterType. Чтобы зарегистрировать оба типа, вам нужно передать идентификатор, литерал. Затем вы можете решить либо стандартный, либо именованный тип. Это было ясное объяснение? :) - person ; 26.08.2011

Вот ссылка на запись в блоге, в которой описывается единство и пример его использования в отношении аспектно-ориентированного программирования (АОП) и внедрения политики. В блоге также есть 3 отличных ссылки на статьи MSDN от Dino Espisito.

http://bardevblog.wordpress.com/2011/03/21/aop-policy-injection-with-unity/

Надеюсь на это

person Mike Barlow - BarDev    schedule 26.08.2011