【问题标题】:Ninject bind open generic interface with open generic implementation having the same closing typesNinject 将开放通用接口与具有相同关闭类型的开放通用实现绑定
【发布时间】:2018-03-21 18:56:43
【问题描述】:

我一直在阅读其他问题和答案,但我无法完全弄清楚我的解决方案的答案。

我有以下场景:

class BaseA {}

class BaseB {}

IInterface<TClassA, TClassB> 
    where TClassA : BaseA
    where TClassB : BaseB

IterfaceImplementation<TClassA, TClassB> :IInterface<TClassA, TClassB> 
    where TClassA : BaseA
    where TClassB : BaseB

class A : BaseA {}

class B : BaseB {}

注意:BaseA 和 BaseB 不实现接口。

有了这个设置,我需要做什么才能让 Ninject 绑定

 IIntreface<A,B>

 InterfaceImplementation<A,B>

我必须有一个绑定

 kernel.Bind<IInterface<A,B>>().To<InterfaceImplementation<A,B>>()

但是,由于BaseABaseB 的多个实现,我试图避免这种情况,并且不想为每个实现做额外的绑定。我想做的是

Bind<IInterface<Any(BaseA), Any(BaseB>>().To<InterfaceImplementation<ThatSame(A), ThatSame(B)>>();

有什么办法吗?

【问题讨论】:

    标签: c# generics dependency-injection ninject


    【解决方案1】:

    指定 open generics 在 .NET 中始终以相同的方式工作:

    kernel.Bind(typeof(IInterface<,>)).To(typeof(InterfaceImplementation<,>));
    

    这将绑定它,因此任何接口关闭类型都将用于实现。逗号可以用作分隔符来指定打开的泛型参数的数量。

    【讨论】:

    • 好吧,这意味着任何 IInterface 都可以绑定到 InterfaceImplementation 并且如果有人试图绑定到不是从 BaseA 和 BaseB 派生的类,编译器应该捕获接口泛型类型的约束,对吗?
    • 它将注册所有实现。当你指定IInterface&lt;BaseA, BaseB&gt;作为构造函数参数时,只有当有这样的实现注册为InterfaceImplementation&lt;BaseA, BaseB&gt;时才会解析。
    • 因此,如果决定为 IInterface 添加特定实现,对于 instacce MyImplementation : IInterface&lt;MyA, MyB&gt;,是否可以使用静态泛型为 instace (Re)bind&lt;IInterface&lt;MyA, MyB&gt;().To&lt;MyImplementation&gt;(); 绑定到该特定实现?
    • 是的,除此之外,您还可以进行其他注册,但如果您走这条路线,则需要为每种类型添加一个注册。或者,您可以使用一些Reflection code 来查找并注册它们。
    • 非常感谢!我的目标是拥有一个为每个派生类实现逻辑的基类,并且额外的绑定是在实现想要偏离基本逻辑的情况下,在这种情况下我想要一个特定的绑定。仍然感谢您的建议,我们将更多地研究开放泛型及其绑定和反射绑定。
    猜你喜欢
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多