Где интерфейсы и реализации находятся в отдельных сборках, где Unity должна отображать их в приложении Prism WPF? - PullRequest
0 голосов
/ 05 января 2011

В настоящее время я работаю над приложением WPF, использующим Prism с Unity. Функциональность модели разделена на несколько проектов библиотек классов. Для каждой группы проблем у меня есть один проект внедрения и один проект, состоящий только из интерфейсов и перечислений. Цель состоит в том, чтобы иметь возможность изменить или полностью заменить dll реализации, не затрагивая и не изменяя что-либо еще в приложении. В этом случае я немного застрял в том, как зарегистрировать интерфейсы для их реализации без жестких ссылок на оба приложения верхнего уровня.

Я знаю, что на них нужно будет ссылаться где-то вместе, но разве это противоречит лучшим методам, которые встречаются в приложении верхнего уровня в загрузчике? Должен ли я вместо этого искать MEF, а не Unity для решения этой конкретной проблемы?

1 Ответ

0 голосов
/ 05 января 2011

Обычно вы делаете это в модуле, содержащем реализации.Контейнер Unity будет предоставлен с использованием внедрения зависимостей в конструктор модуля;следовательно, Shell никогда не нужно фактически регистрировать реализации с интерфейсом.Модуль, содержащий интерфейсы, обычно является инфраструктурной DLL (а не модулем), и поэтому на него могут ссылаться модули реализации.

Обратите внимание, что это соответствует рекомендациям Prism относительно разделения интерфейса / реализации между библиотеками DLL.,Они углубляются в это в отношении услуг;хотя я сомневаюсь, что вы найдете примеры их использования для моделей или других объектов.

Пример:

using Microsoft.Practices.Unity;
using YourInfrastructureDll;

public sealed class ModuleImplementationA : IModule
{
   private readonly IUnityContainer _container;

   public ModuleImplementationA(IUnityContainer container)
   {
      _container = container;
   }

   public void Initialize()
   { 
      // IYourInterface is defined in the Infrastructure DLL, while YourImplementationA exists in this module
      _container.RegisterType<IYourInterface, YourImplementationA>();
   }
}

Это можно заменить другой DLL-библиотекой реализации:

using Microsoft.Practices.Unity;
using YourInfrastructureDll;

public sealed class ModuleImplementationB : IModule
{
   private readonly IUnityContainer _container;

   public ModuleImplementationB(IUnityContainer container)
   {
      _container = container;
   }

   public void Initialize()
   { 
      // IYourInterface is defined in the Infrastructure DLL, while YourImplementationB exists in a different module than the first
      _container.RegisterType<IYourInterface, YourImplementationB>();
   }
}
...