5

我有一个通用接口和IRepository<T>两个实现xrmRepository<T>efRepository<T>

我想更改基于 的绑定T,更具体地说,使用xrmRepositorywhenT派生自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 继承了 Entity。

我不想使用命名绑定,否则我将不得不在任何地方添加名称。

4

2 回答 2

2

使用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>
于 2013-04-16T22:01:21.550 回答
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]));
于 2013-04-17T17:01:35.573 回答