gpt4 book ai didi

.net - 如何使用 Ninject Conventions 库绑定(bind)到不是接口(interface)的基本类型?

转载 作者:行者123 更新时间:2023-12-05 00:36:08 27 4
gpt4 key购买 nike

我正在尝试扫描在与我的应用程序位于同一目录中的程序集中实现特定基类的一组组件。我需要将其作为一种插件式架构来实现,因为我的应用程序使用这些类型来填充其他组件。

Ninject.Extensions.Conventions支持扫描本地目录中的程序集,所以我决定试一试。

问题是库提供的绑定(bind)生成器(DefaultBindingGeneratorRegexBindingGenerator)只会将组件绑定(bind)到它们实现的接口(interface)。它们不会绑定(bind)到非接口(interface)基本类型。

如何使用此库按约定绑定(bind)到基类而不是接口(interface)?

我正在使用 the version currently on NuGet - 2.2.0.5

我当前的基于约定的绑定(bind)代码如下所示:

Kernel.Scan(x =>
{
x.FromAssembliesMatching("*.dll");
x.WhereTypeInheritsFrom<BaseType>();

// I've tried both DefaultBindingGenerator and RegexBindingGenerator
x.BindWith<DefaultBindingGenerator>();

x.InTransientScope();
});

当我尝试解析组件时,没有返回任何内容:
var myTypes = Kernel.GetAll<BaseType>();
int count = myTypes.Count(); // Always returns zero

最佳答案

the current code base up on GitHub , 你可以使用 the BaseBindingGenerator .

在我拥有的代码库(目前在 NuGet - 2.2.0.5 上的代码库)中,我使用自定义 IBindingGenerator 解决了这个问题。 .看过 the sources for the existing binding generators 后写起来相当简单.

public class BaseTypeBindingGenerator<TBase> : IBindingGenerator
{
private static readonly Type baseType = typeof(TBase);

public void Process( Type type, Func<IContext, object> scopeCallback,
IKernel kernel )
{
if ( type.IsInterface || type.IsAbstract || type.BaseType != baseType)
{
return;
}

kernel.Bind(baseType).To(type).InScope(scopeCallback);
}
}

我这样使用它:
Kernel.Scan(x =>
{
x.FromAssembliesMatching("*.dll");
x.WhereTypeInheritsFrom<BaseType>();

x.BindWith<BaseTypeBindingGenerator<BaseType>>();

x.InTransientScope();
});

// ...

var myTypes = Kernel.GetAll<BaseType>();
int count = myTypes.Count(); // Didn't return zero!

关于.net - 如何使用 Ninject Conventions 库绑定(bind)到不是接口(interface)的基本类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8499955/

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