Соглашения Ninject с несколькими From

У меня есть код в NinjectModule, который устанавливает привязки Mock для всех интерфейсов в нескольких сборках. Ninject 2 позволил мне несколько раз вызывать методы From() внутри лямбды Scan:

Kernel.Scan(scanner =>
{
    string first = "MyAssembly";
    Assembly second = Assembly.Load("MyAssembly");
    scanner.From(first);
    scanner.From(second);
    scanner.BindWith<MockBindingGenerator>();
});

Насколько я могу судить, новый способ в Ninject 3 не допускает связанных вызовов From(). Это лучший эквивалент, который я мог придумать:

string first = "MyAssembly";
Assembly second = Assembly.Load("MyAssembly");

Kernel.Bind(x => x
    .From(first)
    .SelectAllInterfaces()
    .BindWith<MockBindingGenerator>());

Kernel.Bind(x => x
    .From(second)
    .SelectAllInterfaces()
    .BindWith<MockBindingGenerator>());

Мой новый код ломается*, когда одна сборка загружается несколько раз, как показано выше. Обратите внимание, что переменные first и second имеют разные типы, поэтому я не могу просто объединить их в один вызов. В моем реальном производственном коде та же проблема, но, конечно, я не просто дважды жестко запрограммирую одно и то же имя сборки.

Итак, как я могу переписать приведенное выше, чтобы я мог комбинировать несколько вызовов From() и вызывать BindWith<> только один раз?

Редактировать

* Сам код привязки выполняется просто отлично. Исключение возникает, когда я пытаюсь получить экземпляр интерфейса, существующего в сборке, которая была привязана дважды.


person MikeWyatt    schedule 28.03.2012    source источник


Ответы (2)


Вы видели синтаксис Join внизу https://github.com/ninject/ninject.extensions.conventions/wiki/Overview ? Я полагаю, это то, что вам нужно...

(Для бонусных баллов: если вы видели документацию, и она просто не выскочила, можете ли вы предложить, считаете ли вы, что лучше всего выделить ее на новую страницу вики, или у вас есть другие идеи? Если вы просто потребляете ее из IntelliSense, не могли бы вы предложить способ, которым вам было бы легче его обнаружить?

РЕДАКТИРОВАТЬ: Поразмыслив, я предполагаю, что вы этого не видели из-за того, что .Join не становится доступным, пока вы не сделаете бит .Select.... (Кстати, мой интерес к этому вызван тем фактом, что я немного отредактировал вики; не стесняйтесь редактировать там все, что вы узнали из этой встречи.))

person Ruben Bartelink    schedule 28.03.2012

Я решил свою проблему, создав список всех имен сборок:

string first = "MyAssembly";                    // .From("MyAssembly")
Assembly second = Assembly.Load("MyAssembly");  // .From(Assembly.Load("MyAssembly"))
Type third = typeof(Foo);                       // .FromAssemblyContaining<Foo>

Kernel.Bind(x => x
    .From(new [] { first, second.FullName, third.Assembly.FullName })
    .SelectAllInterfaces()
    .BindWith<MockBindingGenerator>());
person MikeWyatt    schedule 28.03.2012