Разрешить с правилами в Unity? - PullRequest
2 голосов
/ 09 августа 2011

У меня есть интерфейс IRepository, который отображается в класс GenericRepository в единстве.

IOC.Container.RegisterType<IRepository, GenericRepository>();

(GenericRepository принимает ObjectContext (контекст Entity Framework) для выполнения своих действий с данными)

Проблема заключается вчто мне нужно несколько разных экземпляров GenericRepository.(У меня есть несколько моделей Entity Framework в моем решении)

В каждой части логики бизнес-уровня мне нужно разрешить IRepository и получить GenericRepository, который был инициализирован для Модели, которая соответствует этой части логики бизнес-уровня.

Мне нужен какой-то способ настройки с опциями ... Я не знаю, является ли это проблемой, уникальной для меня, или у других тоже было это.

Есть ли способподскажите Unity как это сделать?

ПРИМЕЧАНИЕ : Я бы предпочел не передавать экземпляр ObjectContext в качестве параметра в метод Resolve.Если я это сделаю, то побеждаю цель шаблона Repository (абстрагирование слоя данных, чтобы я мог легко выполнить модульное тестирование).

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Я думаю, что это будет работать:

IOC.Container.RegisterType<IRepository, GenericRepository>("ModelOne", 
                            new InjectionConstructor(new ModelOneEntities());
IOC.Container.RegisterType<IRepository, GenericRepository>("ModelTwo", 
                            new InjectionConstructor(new ModelTwoEntities());

.....

IRepository modelOneRepository = IOC.Container.Resolve<IRepository>("ModelOne");

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

0 голосов
/ 09 августа 2011

Не могли бы вы, чтобы конкретные реализации репозитория определяли собственный интерфейс? Так что-то вроде этого:

IOC.Container.RegisterType<IModel1Repository, GenericRepository>();
IOC.Container.RegisterType<IModel2Repository, GenericRepository>();

interface IModel1Repository : IRepository
interface IModel2Repository : IRepository

class GenericRepository : IModel1Repository
{
   // Model1 specific ObjectContext 
}

class GenericRepository : IModel2Repository
{
   // Model2 specific ObjectContext
}

Тогда вы можете искать на основе репозитория конкретной модели.

...