使用WithConstructorArgument并创建绑定类型

时间:2011-12-20 18:20:06

标签: ninject ninject-2

我的绑定看起来像这样:

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>());

1 个答案:

答案 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

的第二个approch
kernel.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;
}