Joa*_*eme 5 c# generics ninject repository dynamics-crm-2011
我有一个通用接口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();
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试解决IRepository<Contact>它时,它会转到efRepository,即使Contact继承实体.
我不想使用命名绑定,否则我将不得不在任何地方添加名称.
您还可以像这样定义绑定。我不知道运行时性能,但我认为这种方式更具可读性。如果我没有遗漏什么,它应该会导致相同的行为。
kernel.Bind(typeof(IRepository<>))
.To(typeof(efRepository<>))
.InRequestScope();
kernel.Bind<IRepository<Entity>>()
.To<xrmRepository<Entity>>()
.InRequestScope();
Run Code Online (Sandbox Code Playgroud)
编辑
如果目标是对从 Entity 继承的每个类使用 xrmRepository 这应该可以解决问题
kernel.Bind(typeof(IRepository<>))
.To(typeof(XrmRepository<>))
.When(request => typeof(Entity).IsAssignableFrom(request.Service.GetGenericArguments()[0]));
Run Code Online (Sandbox Code Playgroud)