Ninject Условные обозначения с несколькими Froms - PullRequest
2 голосов
/ 28 марта 2012

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

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<>?

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

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

Ответы [ 2 ]

3 голосов
/ 29 марта 2012

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

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

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

2 голосов
/ 28 марта 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>());
...