Заранее извиняюсь за длинный вопрос, он длинный, потому что я копался в этом весь день.
У меня есть приложение ASP.Net MVC2 со следующими проектами: MyApp.Web, MyApp.Services, MyApp.Data.
Мы кодируем интерфейсы и используем Ninject 2 для DI / IoC.
Однако я ужасно устаю печатать (и забываю печатать):
Bind.To;
Итак, зная о Ninject.Extensions.Convensions, я попытался использовать его для автоматического сканирования и регистрации модулей и простых зависимостей типа IXxxx => Xxxx.
Я могу использовать следующий код для настройки Ninject, и, похоже, все работает так, как ожидалось.
public static IKernel Initialize()
{
var kernel = new StandardKernel();
kernel.Scan(a => {
a.FromAssemblyContaining();
a.FromAssemblyContaining();
a.AutoLoadModules();
a.BindWithDefaultConventions();
a.InTransientScope();
});
return kernel;
}
Однако ... Я хотел бы пойти немного дальше, так как я думаю, что поддерживается, но я не могу заставить его работать.
Поскольку наш проект MyApp.Web использует вообще ничего (напрямую) из MyApp.Data, я стараюсь избегать ссылки на MyApp.Data. В приведенном выше коде я должен ссылаться на MyApp.Data из MyApp.Web из-за ссылки на SomeDataClass во время компиляции.
Я бы предпочел указать имя сборки, которую Ninject будет сканировать и регистрировать. Кажется, что расширение Conventions поддерживает это с помощью перегрузок From, которые принимают строку (или перечислимые строки).
Итак, я пробовал несколько вариантов перегрузок From:
public static IKernel Initialize()
{
var kernel = new StandardKernel();
kernel.Scan(a => {
a.From("MyApp.Data");
a.From("MyApp.Services.dll");
a.From("AnotherDependency, Version=1.0.0.0, PublicKeyToken=null"); //etc., etc. with the From(...)'s
a.AutoLoadModules();
a.BindWithDefaultConventions();
a.InTransientScope();
});
return kernel;
}
Но я получаю FileNotFoundExceptions с таким сообщением:
Не удалось загрузить файл или сборку. 'файл: /// C: \ Program Files (x86) \ Общие файлы \ Microsoft Общий \ DevServer \ 10.0 \ MyApp.Data ' или одна из его зависимостей. Система не могу найти файл указано. ":" file: /// C: \ Program Files (x86) \ Общие файлы \ Microsoft Shared \ DevServer \ 10.0 \
Я проверил исходный код Ninject.Extensions.Conventions, и я признаю, что совершенно не понимаю, как это должен работать, но я могу видеть, что он делает.
Сканер сборок составляет список сборок для сканирования, когда мы вызываем различные методы FromXXX.
Когда я вызываю метод From ("assemblyName"), сначала он проверяет, содержит ли список уже какие-либо сборки, у которых имя assembly.AssemblyName.Name совпадает с именем, которое я передал (а AssemblyName.Name - это простое имя, то есть MyApp.Data, согласно MSDN).
Поток проходит через пару неважных методов, попадая в метод FindAssemblies. Этот метод принимает имя, которое я передал (которое, как мы уже видели, должно быть простым именем сборки). Затем он создает новое имя AssemblyName с нашим переданным именем, используемым как AssemblyName.CodeBase.
Затем он пытается загрузить сборку во временный домен приложения. Это шаг, который завершился ошибкой с указанным выше исключением.
Очевидно, путь, который он ищет, неверен, но я не могу указать путь с помощью метода From (). Это тоже не работает.
Я пробовал некоторые другие методы FromXXX, но ничего не добился и уже потратил на это слишком много времени. FromAssembliesInPath и FromAssembliesMatching также не работают, потому что, опять же, он выполняет поиск в совершенно неправильном каталоге.
Кто-нибудь может объяснить, как заставить Ninject Conventions загружать сборки по имени, без создания ссылки на сборку и ее загрузки, указав содержащийся тип? Пожалуйста.
Я уже просматривал страницы и страницы группы Ninject google , и я прочитал только (как кажется) соответствующую документацию и не смог решить ... пока.