2012-01-03 13 views
6

Tengo el siguiente códigoCómo utilizar un proveedor de Ninject

public class Something { 
    [Inject] 
    public Configuration config {get;set;} //singleton 
    [Inject] 
    public Provider<WindowHandler> windowsProvider { get; set; } //NOT singleton 

    public void Search(string text) { 
     WindowHandler handler = windowsProvider.Create(xxxxxx); 
     //use the new handler that was created 
    } 
} 

pero parece que el proveedor tiene un IconText donde pongo xxxxxx. El IContext no debería utilizarse desde el momento en que arranque y cree Something.cs desde el kernel. ¿Dónde está el método Crear sin parámetro en el Proveedor? (Vengo desde el punto de vista terrestre de Guice, donde se codificaría como arriba).

así que la pregunta es ¿Cómo hago esto correctamente?

gracias, Dean

Respuesta

12

Parece que están tratando de utilizar un proveedor como una fábrica en el código.

Un proveedor en términos de Ninject es una fábrica que se le da a Ninject para crear objetos especialmente creados. Por lo tanto, obtiene el contexto de resolución que se puede usar para crear diferentes instancias, dependiendo de dónde se inyecte la instancia.

public class FooProvider : Provider<IFoo> 
{ 
    public override IFoo CreateInstance(IContext ctx) 
    { 
     // add here your special IFoo creation code 
     return new Foo(); 
    } 
} 

kernel.Bind<IFoo>().ToProvider<FooProvider>(); 

Lo que queremos es una fábrica en el codificador que crea una instancia de WindowHandler. Por lo tanto crear una interfaz para crear la instancia de esta manera:

public interface IWindowHandlerFactory 
{ 
    WindowHandler Create(); 
} 

Bind<IWindowHandlerFactory>().ToFactory(); 

alternativa, se puede inyectar Func<WindowHandler> sin añadir una configuración. Pero esto es menos significativo en mi opinión.

NOTA: Todo esto requiere Ninject.Extensions.Factory disponible como prelanzamiento 3.0.0-rc2 de Nuget.

Consulte también: http://www.planetgeek.ch/2011/12/31/ninject-extensions-factory-introduction/

+0

Func es exactamente lo que estaba buscando. ¿No hay una forma de hacerlo en 2.0, que es la versión en la que estamos? –

+1

Ver http://stackoverflow.com/questions/4840157/does-ninject-support-func-auto-generated-factory/4851885#4851885 –

1

Bueno, mi solución final era hacer trampa en ninject 2.0 con el siguiente código ...

 var windowFactory = kernel.Get<IEWindowFactory>(); 
     var tabFactory = kernel.Get<IETabFactory>(); 
     windowFactory.Kernel = kernel; 
     tabFactory.Kernel = kernel; 

y en la lista de fijaciones que tienen

Bind<IEWindowFactory>().ToSelf().InSingletonScope(); 
Bind<IETabFactory>().ToSelf().InSingletonScope(); 

y después de eso simplemente empiezo mi aplicación

var main = kernel.Get<MainForm>(); 
main.Start(); 

y, por supuesto, las fábricas se inyectan donde los necesito en la jerarquía de ese MainForm.

Así que coloco manualmente el kernel al arrancar y luego, cuando reinicio mi aplicación, naturalmente estas fábricas son campos en clases con la anotación [Ninject] y así pueden crear objetos. no es el más limpio hasta que obtengamos 3.0, pero funciona (y odio las clases de fábrica adicionales para las que tengo que escribir código, pero bueno).

Cuestiones relacionadas