Скажите, не удалось ли связать соглашение 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

Это, вероятно, длиннее, чем ваш текущий код, но это позволит дальнейшую настройку созданных привязок.

Другие вопросы по тегам