我有一个通用接口IRepository<T>
和两个实现xrmRepository<T>
和efRepository<T>
我希望根据T
更改绑定,更具体地说,xrmRepository
从T
派生时使用Entity
。我怎么能做到这一点?
我目前有:
kernel.Bind(typeof(IRepository<>)).To(typeof(efRepository<>)).InRequestScope();
kernel.Bind(typeof(IRepository<>)).To(typeof(xrmRepository<>)).When(request => request.Service.GetGenericArguments()[0].GetType().IsSubclassOf(typeof(Entity))).InRequestScope();
但是当我尝试解析IRepository<Contact>
时,它会进入efRepository,即使Contact继承实体。
我不想使用命名绑定,否则我将不得不在任何地方添加名称。
答案 0 :(得分:2)
您也可以像这样定义绑定。我不知道运行时性能,但我认为这种方式更具可读性。如果我没有遗漏某些东西,它应该导致相同的行为。
kernel.Bind(typeof(IRepository<>))
.To(typeof(efRepository<>))
.InRequestScope();
kernel.Bind<IRepository<Entity>>()
.To<xrmRepository<Entity>>()
.InRequestScope();
修改强>
如果目标是为从Entity继承的每个类使用xrmRepository,那么应该这样做
kernel.Bind(typeof(IRepository<>))
.To(typeof(XrmRepository<>))
.When(request => typeof(Entity).IsAssignableFrom(request.Service.GetGenericArguments()[0]));
答案 1 :(得分:1)
使用When
方法声明绑定条件。示例如下:
kernel.Bind(typeof(IRepository<>))
.To(typeof(efRepository<>))
.When(request => request.Service.GetGenericArguments()[0] == typeof(Entity))
.InRequestScope();
kernel.Bind(typeof(IRepository<>))
.To(typeof(xrmRepository<>))
.InRequestScope();
kernel.Get<IRepository<Entity>>(); //will return efRepository<Entity>
kernel.Get<IRepository<int>>(); //will return xrmRepository<int>