Как создать единицу работы - PullRequest
0 голосов
/ 31 августа 2010

Я использую шаблон внедрения зависимостей для разрешения правильного экземпляра моего UnitOfWork.Когда я использую только одно сопоставление типов, все в порядке

unityContainer.RegisterType<IUnitOfWork, UnitOfWork>(); 

Проблема возникает, когда я использую два сопоставления типов для одного и того же интерфейса:

unityContainer.RegisterType<IUnitOfWork, UnitOfWork1>(); 
unityContainer.RegisterType<IUnitOfWork, UnitOfWork2>(); 

У меня очень распространенный кодчто при совершении вызова типа

var unitOfWork = ServiceLocator.GetInstance<IUnitOfWork>(); 

В некоторых случаях он должен возвращать UnitOfWork, в некоторых случаях он должен возвращать UnitOfWork2.

Как решить эту проблему без рефакторинга общей части?

PS И да - знаю про именованные контейнеры))

1 Ответ

1 голос
/ 31 августа 2010

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

unityContainer.RegisterType<IUnitOfWork, UnitOfWork1>("MyUnit1");
unityContainer.RegisterType<IUnitOfWork, UnitOfWork2>("MyUnit2");

Затем для разрешения правильного экземпляра вы можете использовать следующий синтаксис:

var unitOfWork = ServiceLocator.GetInstance<IUnitOfWork>("MyUnit2"); 

Другой вариант - украсить другой класс UnitOfWork некоторым интерфейсом (например, IUnitOfWork2). Затем зарегистрируйте UnitOfWork2 в IUnitOfWork2 и при необходимости разрешите экземпляр этим новым интерфейсом.

Хотя вы упоминаете, что не хотите реорганизовывать метод ServiceLocator.GetInstance. Я все еще думаю, что самым простым способом было бы добавить необязательный параметр в метод GetInstance и использовать именованные экземпляры. Если об этом не может быть и речи, вы можете зарегистрировать фабричный класс в IUnitOfWork и использовать его для получения правильной реализации UnitOfWork. Вот краткое руководство о том, как зарегистрировать фабрику в Unity. Обратите внимание, что последняя версия Unity может иметь другой способ сделать это. Кроме того, вот вопрос от Stack Overflow, касающийся контейнеров и фабрик Unity.

...