Cómo usar la extensión Convenciones de Ninject sin hacer referencia a Ensamblaje (o Tipos dentro de él)

Lo siento de antemano por la larga pregunta, es larga porque he estado cavando en esto todo el día.

El problema general:

Tengo una aplicación ASP.Net MVC2 con los siguientes proyectos: MyApp.Web, MyApp.Services, MyApp.Data.

Codificamos las interfaces y utilizamos Ninject 2 para DI / IoC.

Sin embargo, me estoy poniendomuy cansado de escribir (y olvidando escribir):

Bind<ISomeService>.To<SomeService>;

Entonces, conociendo Ninject.Extensions.Convensions, he intentado usarlo para escanear y registrar automáticamente módulos y dependencias simples del tipo IXxxx => Xxxx.

Lo que probé funciona (pero no es suficiente):

Puedo usar el siguiente código para configurar Ninject, y todo parece estar conectado como se esperaba.

    public static IKernel Initialize()
    {
        var kernel = new StandardKernel();

        kernel.Scan(a => {
                        a.FromAssemblyContaining<MyApp.Data.SomeDataClass>();
                        a.FromAssemblyContaining<MyApp.Services.SomeServiceClass>();
                        a.AutoLoadModules();
                        a.BindWithDefaultConventions();
                        a.InTransientScope();
                    });

        return kernel;
    }
Lo que quiero lograr en su lugar:

Sin embargo ... Me gustaría llevar esto un poco más lejos de una manera que yopensar es compatible, pero parece que no puedo hacerlo funcionar.

Dado que nuestro proyecto MyApp.Web no utiliza nada (directamente) de MyApp.Data, estoy tratando de evitar una referencia a MyApp.Data. Con el código anterior, yodebe referencia MyApp.Data desde MyApp.Web debido a la referencia de tiempo de compilación a SomeDataClass.

Preferiría especificar elnombre de un ensamblaje para que Ninject escanee y se registre. Parece que la extensión Convenciones lo admite a través de las sobrecargas From que toman una cadena (o enumerable de cadenas).

Lo que probé y cómo se rompe:

Entonces, probé varias variaciones en las sobrecargas de 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;
    }

Pero recibo FileNotFoundExceptions con un mensaje como:

No se pudo cargar el archivo o ensamblado 'archivo: /// C: \ Archivos de programa (x86) \ Archivos comunes \ Microsoft Shared \ DevServer \ 10.0 \ MyApp.Data' o una de sus dependencias. El sistema no puede encontrar el archivo especificado. ":" Archivo: /// C: \ Archivos de programa (x86) \ Archivos comunes \ Microsoft Shared \ DevServer \ 10.0 \ Lo que he encontrado tratando de resolver esto yo mismo:

Revisé la fuente de Ninject.Extensions.Conventions, y admitiré que estoy totalmente perdido en cuanto a cómo se supone que funciona, pero puedo ver lo que está haciendo.

El escáner de ensamblaje crea una lista de ensamblajes para escanear, ya que llamamos a varios métodos FromXXX.

Cuando llamo al método From ("assemblyName"), primero comprueba si la lista ya contiene ensamblajes en los que el ensamblado.AssemblyName.Name es igual al nombre que ingresé (y AssemblyName.Name es el

sencillo nombre, es decir, MyApp.Data, de acuerdo con MSDN).El flujo pasa por un par de métodos sin importancia, aterrizando en el método FindAssemblies. Este método toma el nombre que pasé (que ya vimos se supone que es un

sencillo nombre de la asamblea). Luego crea un nuevo AssemblyName, con nuestro nombre pasado utilizado como AssemblyName.CodeBase.Luego, intenta cargar el ensamblado en un AppDomain temporal. Este es el paso que falla con la excepción anterior.

Obviamente, la ruta que está buscando es incorrecta, pero no puedo proporcionar una ruta a través del método From (). Eso tampoco funciona.

He probado algunos de los otros métodos FromXXX, pero no he llegado a ninguna parte y ya he dedicado demasiado tiempo a esto. FromAssembliesInPath y FromAssembliesMatching tampoco funcionan porque, de nuevo, está buscando en el directorio completamente incorrecto.

Uh ... cuál era la pregunta otra vez:

¿Alguien puede explicar cómo hacer que los Convenios Ninject carguen ensamblajes por nombre, sin crear una referencia al ensamblaje y cargarlo especificando un tipo contenido? Por favor.

Ya he buscado en páginas y páginas de

Ninject google groupy he leído que essolo (al parecer) documentación relevante y no he podido resolverlo ... todavía.Has hecho un buen trabajo en la pregunta. Ahora iría a publicar esto en la lista de correo: hay muchas más personas que usan los escenarios menos convencionales allí, y no todos miran aquí ...

Respuestas a la pregunta(2)

Su respuesta a la pregunta