判断 Ninject 约定绑定是否失败
Tell if Ninject convention bind failed
我正在使用 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 window 中,我看到抛出异常但在它冒泡之前被捕获。
您可以围绕 AllInterfacesBindingGenerator
class 创建一个包装器并使用它来计算生成的绑定:
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
这可能比您当前的代码长,但它允许进一步自定义已创建的绑定。
Assembly的加载需要你自己来完成,然后你可以控制是否抛出异常。使用
From(params Assembly[] assemblies)
过载。
使用 Assembly.LoadFrom()
或 Assembly.Load
加载程序集。
我正在使用 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 window 中,我看到抛出异常但在它冒泡之前被捕获。
您可以围绕 AllInterfacesBindingGenerator
class 创建一个包装器并使用它来计算生成的绑定:
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
这可能比您当前的代码长,但它允许进一步自定义已创建的绑定。
Assembly的加载需要你自己来完成,然后你可以控制是否抛出异常。使用
From(params Assembly[] assemblies)
过载。
使用 Assembly.LoadFrom()
或 Assembly.Load
加载程序集。