C# 告知Ninject约定绑定是否失败

C# 告知Ninject约定绑定是否失败,c#,ninject,ninject-conventions,C#,Ninject,Ninject Conventions,我正在使用Ninject.Extensions.Conventions动态添加绑定。要加载的.dll名称存储在配置中。如果配置不正确且无法加载.dll,最好了解这一点。当前,没有出现加载.dll失败的情况。例如,如果我尝试加载一个土豆,则不会出现错误: foreach (var customModule in customModuleConfigs) { KeyValuePair<string, KVP> module = customModule; _kernel

我正在使用Ninject.Extensions.Conventions动态添加绑定。要加载的.dll名称存储在配置中。如果配置不正确且无法加载.dll,最好了解这一点。当前,没有出现加载.dll失败的情况。例如,如果我尝试加载一个土豆,则不会出现错误:

foreach (var customModule in customModuleConfigs)
{
    KeyValuePair<string, KVP> module = customModule;

    _kernel.Bind(scanner => scanner
        .From(module.Value.Value)
        .SelectAllClasses().InheritedFrom<ICamModule>()
        .BindAllInterfaces());

    // I need to know this failed
    _kernel.Bind(scanner => scanner
        .From("potato")
        .SelectAllClasses().InheritedFrom<ICamModule>()
        .BindAllInterfaces());
}
foreach(custommoduleconfig中的var customModule)
{
KeyValuePair模块=自定义模块;
_Bind(scanner=>scanner
.From(module.Value.Value)
.SelectAllClasses().InheritedFrom()
.BindAllInterfaces());
//我要知道这是失败的
_Bind(scanner=>scanner
.来自(“马铃薯”)
.SelectAllClasses().InheritedFrom()
.BindAllInterfaces());
}

有没有办法知道我的配置不好?在IntelliTrace窗口中,我看到一个异常被抛出,但在它冒泡之前被捕获。

您可以在
AllInterfacesBindingGenerator
类周围创建一个包装器,并使用它计算生成的绑定:

public class CountingInterfaceBindingGenerator : IBindingGenerator
{
    private readonly IBindingGenerator innerBindingGenerator;

    public CountingInterfaceBindingGenerator()
    {
        this.innerBindingGenerator =
            new AllInterfacesBindingGenerator(new BindableTypeSelector(), new SingleConfigurationBindingCreator());
    }

    public int Count { get; private set; }

    public IEnumerable<IBindingWhenInNamedWithOrOnSyntax<object>> CreateBindings(Type type, IBindingRoot bindingRoot)
    {
        this.Count++;

        return this.innerBindingGenerator.CreateBindings(type, bindingRoot);
    }
}
公共类计数接口绑定生成器:IBindingGenerator
{
专用只读IBindingGenerator innerBindingGenerator;
公共计数接口绑定生成器()
{
这是innerBindingGenerator=
新的AllInterfacesBindingGenerator(新的BindableTypeSelector(),新的SingleConfigurationBindingCreator());
}
公共整数计数{get;私有集;}
公共IEnumerable CreateBindings(类型类型,IBindingRoot bindingRoot)
{
这个.Count++;
返回此.innerBindingGenerator.CreateBindings(类型,bindingRoot);
}
}
用法:

var kernel = new StandardKernel();
var bindingGenerator = new CountingInterfaceBindingGenerator();

kernel.Bind(b =>
{
    b.From("potato")
        .SelectAllClasses()
        .InheritedFrom<ICamModule>()
        .BindWith(bindingGenerator);
});

if (bindingGenerator.Count == 0)
    // whatever
var-kernel=new-StandardKernel();
var bindingGenerator=new CountingInterfaceBindingGenerator();
Bind(b=>
{
b、 来自(“土豆”)
.SelectAllClasses()
.继承自()
.BindWith(bindingGenerator);
});
if(bindingGenerator.Count==0)
//随便

这可能比您当前的代码要长,但它允许进一步自定义已创建的绑定。

您需要自己加载程序集,然后可以控制是否引发异常。使用

来自(参数程序集[]程序集)
重载


通过使用
assembly.LoadFrom()
assembly.Load

加载程序集,我已经解决了这个问题,在比较前后的绑定数,但仍在寻找更好的方法。谢谢,这正是我需要的。出于某种原因,我认为在Ninject框架外部加载程序集会更麻烦,但这非常简单,允许我捕获并记录异常以便于维护。感谢Frank,这是一种比我现有的更优雅的方法,我将使用它。我给出了#BatteryBackupUnit think的答案,因为它允许我捕获并记录程序集加载失败——这正是我所寻找的(如果在程序集中找不到实现,则记录)。