У меня есть привязка, которая выглядит следующим образом:
kernel.Bind<IRepository<Holiday>>().To<RepositoryBase<Holiday>>();
Проблема в том, что RepositoryBase принимает параметр-конструктор UnitOfWork, называемый context.Это само по себе не является проблемой.Ninject должен решить это.За исключением того факта, что у меня есть две реализации UnitOfWork, каждая из которых связана с использованием дискриминатора атрибута.
kernel.Bind<IUnitOfWork>().To<MS_DevEntities>().WhenTargetHas<MsDataAttribute>()
.InRequestScope();
Как можно указать, что при создании IRepository его следует создавать с помощью MS_DevEntities?
Конечно, я мог бы сделать что-то вроде этого:
kernel.Bind<IRepository<Holiday>>().To<RepositoryBase<Holiday>>()
.WithConstructorArgument("context", new MS_DevEntities());
Однако я бы предпочел, чтобы Ninject создал экземпляр, особенно потому, что я использую жизненный цикл .InRequestScope ().
Есть какие-нибудь предложения?
РЕДАКТИРОВАТЬ:
Раньше я использовал класс, который выглядел так:
public class HolidayRepository : RepositoryBase<Holiday>, IHolidayRepository
{
public HolidayRepository([MsData]IUnitOfWork context) : base(context){}
}
Однако теперь я нахожу себяс несколькими десятками из них, и они мало что делают, но добавляют дополнительную работу, когда мне нужно создать новый репозиторий.Я хотел бы просто отобразить их непосредственно в привязках.
EDIT2:
Полагаю, я мог бы сделать что-то подобное, но это выглядит как хакерский.Есть ли лучший способ?
kernel.Bind<MS_DevEntities>().ToSelf().InRequestScope();
kernel.Bind<IRepository<Holiday>>().To<RepositoryBase<Holiday>>()
.WithConstructorArgument("context",
(context) => context.Kernel.Get<MS_DevEntities>());