引入上下文绑定和开放泛型

本文关键字:泛型 绑定 上下文 | 更新日期: 2023-09-27 18:09:28

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

我想基于T更改绑定,更具体地说,当T派生自Entity时使用xrmRepository。我怎么才能做到呢?

我现在有:

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,即使接触继承实体。

我不想使用命名绑定,否则我将不得不到处添加名称。

引入上下文绑定和开放泛型

您还可以这样定义绑定。我不知道运行时性能如何,但我认为这种方式更具可读性。如果我没有遗漏什么,它应该会导致相同的行为。

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

使用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>