gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:30:32 24 4
gpt4 key购买 nike

想象一下,我有以下类和接口(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com