Как использовать расширение Ninject Conventions без ссылки на Assembly (или Типы в нем)

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

Общая проблема:

У меня есть приложение 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 , и я прочитал только (как кажется) соответствующую документацию и не смог решить ... пока.

18
задан Steven 11 July 2013 в 07:41
поделиться