我的绑定看起来像这样:
kernel.Bind<IRepository<Holiday>>().To<RepositoryBase<Holiday>>();
问题是RepositoryBase采用了一个名为context的UnitOfWork的构造函数参数。这不是,本身就是一个问题。 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:
我想我可以做这样的事情,但似乎有点像个hackish。还有更好的方法吗?
kernel.Bind<MS_DevEntities>().ToSelf().InRequestScope();
kernel.Bind<IRepository<Holiday>>().To<RepositoryBase<Holiday>>()
.WithConstructorArgument("context",
(context) => context.Kernel.Get<MS_DevEntities>());
答案 0 :(得分:5)
E.g。将属性放入实体并使用以下内容:
kernel.Bind(typeof(IRepository<>)).To(typeof(RepositoryBase<>));
kernel.Bind<IUnitOfWork>().To<MS_DevEntities>()
.When(r => EntityHas<MsData>(r));
kernel.Bind<IUnitOfWork>().To<TheOtherOne_DevEntities>()
.When(r => EntityHas<TheOtherData>(r));
bool EntityHas<TAttribute>(IRequest r)
{
return r.Target.Member.ReflectedType.IsGenericType &&
r.Target.Member.ReflectedType.GetGenericArguments()[0]
.GetCustomAttributes(typeof(TAttribute), false).Any();
}
您可以使用此When
条件执行所有操作,并从r.Target.Member.ReflectedType.GetGenericArguments()[0]
获取实体类型,以查找您必须使用此实体类型的UoW。
使用config
的第二个approchkernel.Bind<IUnitOfWork>().To<TheOtherOne_DevEntities>()
.When(r => EntityNeedsUoW(r, 1));
bool EntityNeedsUoW(IRequest r, int id)
{
return UoWConfig.GetDbIdForEntity(
r.Target.Member.ReflectedType.GetGenericArguments()[0]) == id;
}