ninject - 使用 NInject 绑定(bind)泛型接口(interface),如果没有设置泛型类型的绑定(bind),则使用默认值

标签 ninject

想象一下,我有以下类和接口(interface):

public interface IService<T> { }

public class DefaultService<T> : IService<T> { }

public class FooService : IService<Foo> { }

public class BarService : IService<Bar> { }

然后我希望能够像这样从内核中获取实例:
Kernel.Get<IService<Foo>>();  // Should return FooService
Kernel.Get<IService<Bar>>();  // Should return BarService
Kernel.Get<IService<Dog>>();  // Should return DefaultService
Kernel.Get<IService<Cat>>();  // Should return DefaultService
Kernel.Get<IService<Giraffe>>();  // Should return DefaultService

是否可以使用 NInject 设置绑定(bind)(可能使用 Conventions 扩展),这样我就不必手动绑定(bind) IService 的每个可能实现?

最佳答案

我最近一直在做类似的事情,并为您的问题想出了一些更简单的解决方案(虽然有点弱)。

将泛型实现(DefaultService)绑定(bind)到泛型接口(interface),并将具体实现(FooService、BarService)绑定(bind)到具体接口(interface)就足够了。当您请求接口(interface)的具体实例时,Ninject 会解析您是否定义了具体绑定(bind)。如果你这样做了,它会为你提供适当的实例,否则它会落入通用绑定(bind)。下面的代码应该可以解决问题。

var kernel = new StandardKernel();
kernel.Bind(typeof(IService<>)).To(typeof(DefaultService<>));
kernel.Bind<IService<Foo>>().To<FooService>();
kernel.Bind<IService<Bar>>().To<BarService>();

编辑:

这个概念适用于整个 Ninject,因此您也可以将它与 Extensions.Conventions 一起使用。
例如定义以下内容:
public class Foo{}
public class Bar{}
public class Dog{}

public interface IService<T>{}
public class DefaultService<T> : IService<T>{}
public class FooService : IService<Foo>{}
public class BarService : IService<Bar>{}

使用约定来绑定(bind)服务:
kernel.Bind(x => x.FromThisAssembly()
                  .SelectAllClasses()
                  .InheritedFrom(typeof(IService<>))
                  .BindSingleInterface());

并创建和检查适当的服务:
Assert.IsInstanceOf<BarService>(kernel.Get<IService<Bar>>());
Assert.IsInstanceOf<FooService>(kernel.Get<IService<Foo>>());
Assert.IsInstanceOf<DefaultService<Dog>>(kernel.Get<IService<Dog>>());

关于ninject - 使用 NInject 绑定(bind)泛型接口(interface),如果没有设置泛型类型的绑定(bind),则使用默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6066692/

相关文章:

asp.net-mvc - 如何在我的 MVC3 项目中正确配置 Ninject.Extensions.Logging.Log4Net

ninject - 在我的 MVC3 中使用 Ninject 时,我得到一个 Ninject.ActivationException : Error activating IRepository{Ranking} installed via Nuget

c# - Ninject 绑定(bind),接口(interface)到接口(interface)

c# - 合并 Linq 查询

c# - 使用 Ninject 基于字符串创建对象

asp.net-mvc - Ninject 获取实例时出现问题

c# - webapp 的 `InSingletonScope` 究竟有多长?

asp.net - 使用ninject时出现异常

c# - 没有服务定位器的领域事件

asp.net-mvc - Ninject DI 导致部署问题