1

我正在使用 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());
}

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

4

2 回答 2

1

您可以围绕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);
    }
}

用法:

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

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

if (bindingGenerator.Count == 0)
    // whatever

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

于 2015-01-12T23:11:22.397 回答
1

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

From(params Assembly[] assemblies)超载。

使用Assembly.LoadFrom()或加载程序集Assembly.Load

于 2015-01-13T05:58:44.190 回答