Как создать единицу работы
Я использую шаблон внедрения зависимостей для разрешения правильного экземпляра моего UnitOfWork. Когда я использую только одно сопоставление типов, все в порядке
unityContainer.RegisterType<IUnitOfWork, UnitOfWork>();
Проблема возникает, когда я использую два сопоставления типов для одного и того же интерфейса:
unityContainer.RegisterType<IUnitOfWork, UnitOfWork1>();
unityContainer.RegisterType<IUnitOfWork, UnitOfWork2>();
У меня есть очень распространенный код, который делает звонок как
var unitOfWork = ServiceLocator.GetInstance<IUnitOfWork>();
В некоторых случаях он должен возвращать UnitOfWork, в некоторых случаях он должен возвращать UnitOfWork2.
Как решить эту проблему без рефакторинга общей части?
PS И да - знаю про именованные контейнеры))
1 ответ
Вы можете использовать именованные экземпляры вместо именованных контейнеров. Вы можете зарегистрировать именованный экземпляр в 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.