Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Ninject-自动绑定程序集中继承自泛型基类(进而实现泛型接口)的所有类_C#_Generics_Binding_Inversion Of Control_Ninject - Fatal编程技术网

C# Ninject-自动绑定程序集中继承自泛型基类(进而实现泛型接口)的所有类

C# Ninject-自动绑定程序集中继承自泛型基类(进而实现泛型接口)的所有类,c#,generics,binding,inversion-of-control,ninject,C#,Generics,Binding,Inversion Of Control,Ninject,我有一组从基类继承的类,基类反过来实现了一个通用接口。下面是一个例子: public ConcreteClassForA : BasePlatformClass<ContractA> {} public ConcreteClassForB : BasePlatformClass<ContractB> {} public ConcreteClassForC : BasePlatformClass<ContractC> {} public-ConcreteCla

我有一组从基类继承的类,基类反过来实现了一个通用接口。下面是一个例子:

public ConcreteClassForA : BasePlatformClass<ContractA> {}
public ConcreteClassForB : BasePlatformClass<ContractB> {}
public ConcreteClassForC : BasePlatformClass<ContractC> {}
public-ConcreteClassForA:BasePlatformClass{}
公共ConcreteClassForB:BasePlatformClass{}
公共ConcreteClassForC:BasePlatformClass{}
基础平台定义为:

public BasePlatformClass<T> : IPlatform<T> {}
public BasePlatformClass:ipplatform{}
是否有一种方法可以自动将所有ConcreteClassX类绑定到这些通用实现,而无需逐个指定?例如,这项工作:

kernel.Bind<ConcreteClassForA>().To<IPlatform<ContractA>>()
kernel.Bind()到()
但是我们将有数百个这样的类,并且不想管理一个大型的Ninject模块。如果我能以某种方式从程序集中获取所有这些类并自动绑定它们,那就更好了

如果有必要的话,我不介意进行一些反思,但我觉得Ninject提供了一些开箱即用的东西,只是不确定如何

我在这里找到了几个建议,但都没能奏效

有什么想法吗?

当然,试试看

var-kernel=new-StandardKernel();
Bind(x=>x.FromThisAssembly().SelectAllClasses().BindAllInterfaces());
var result=kernel.Get();

您可以使用反射并遍历所有类Definitiley,这是我最后的选择-但我觉得Ninject.Extensions.Conventions软件包中必须支持类似的内容技术上讲,所有这些类和泛型接口都是不同的类型,因此即使存在这样的扩展,它也必须做以下两件事之一:分析代码以提取您使用的模式并自动查找类型(类似于R#和Roslyn所能做的事情)或者让您设置哪些类型应映射到哪些接口的规则,并使用反射遍历所有类型并应用您的规则。使用这两种技术很可能和你的“最后手段”一样复杂。是的,这只是从维护的角度来看的-我讨厌使用反射,因为我需要半个小时才能掌握代码的功能:)无论如何,我将尝试以这种方式工作,我们将看到它是如何运行的。@Steven这不是重复的,因为相关线程解决了实现接口的类的注入问题。我的场景是,所有类都从基类继承,基类反过来实现接口。请删除“duplicate”标记并相应地修改主题(因为它位于帖子列表的底部)。这不起作用,因为类实现了基类,而基类又实现了接口。我认为将具体的实现注入基类是可行的,但不能将实现注入接口(它缺少基类部分)。有什么建议吗?@Mirza,你试过了吗?当我运行提供的代码时,结果的类型是
ConcreteClassForA
,与预期的一样,不是吗?
        var kernel = new StandardKernel();
        kernel.Bind(x => x.FromThisAssembly().SelectAllClasses().BindAllInterfaces());
        var result = kernel.Get<IPlatform<ContractA>>();