Ninject Условные обозначения с несколькими Froms
У меня есть код в 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<>
один раз?
редактировать
* Сам код привязки выполняется просто отлично. Исключение возникает, когда я пытаюсь получить экземпляр интерфейса, который существует в сборке, которая была связана дважды.
2 ответа
Вы видели Join
синтаксис внизу https://github.com/ninject/ninject.extensions.conventions/wiki/Overview? Я полагаю, это то, что вы после...
(Для бонусных баллов: если вы видели документы, а они просто не выпрыгивали, можете ли вы подсказать, считаете ли вы, что их лучше разделить на новую вики-страницу, или у вас есть другие идеи? Если вы просто потребляете их) от IntelliSense, можете ли вы предложить способ, которым вы могли бы обнаружить это более легко?
РЕДАКТИРОВАТЬ: На размышление, я думаю, вы не видели это из-за того, что .Join
не станет доступным, пока вы не сделаете .Select...
немного. (Кстати, мой интерес к этому обусловлен тем фактом, что я занимался редактированием в вики; не стесняйтесь редактировать все, что вы узнали из этой встречи, там же.))
Я решил свою проблему, создав список всех имен сборок:
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>());