Скажите, не удалось ли связать соглашение Ninject
Я использую 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 я вижу выброшенное исключение, но оно застыло до того, как оно вспыхнет.
2 ответа
Вам нужно будет выполнить загрузку сборки самостоятельно, тогда вы сможете контролировать, будет ли выброшено исключение. Использовать
From(params Assembly[] assemblies)
перегрузки.
Загрузите сборку, используя Assembly.LoadFrom()
или же Assembly.Load
,
Вы можете создать обертку вокруг 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
Это, вероятно, длиннее, чем ваш текущий код, но это позволит дальнейшую настройку созданных привязок.