2012-07-30 13 views

Respuesta

7

Sí, pase los argumentos del constructor en una instancia de tipo anónimo; los nombres de propiedad deben coincidir con los nombres de los parámetros del constructor:

IColor desiredColor = //whatever 
int desiredNumber = //whatever else 
IFoo foo = container.Resolve<IFoo>(new { c = desiredColor, somenumber = desiredArgumentValue }); 

Si está utilizando una versión anterior de C# que no admite los tipos anónimos (o incluso si no estás), se puede hacer lo mismo con un diccionario :

IColor desiredColor = //whatever 
int desiredNumber = //whatever 
Dictionary<string, object> arguments = new Dictionary<string, object>(); 
arguments.Add("c", desiredColor); 
arguments.Add("somenumber", desiredNumber); 
IFoo foo = container.Resolve<IFoo>(arguments); 
+0

¿Qué pasa con el parámetro IColor? – Darragh

+0

@Darragh He editado la respuesta para incluir un argumento correspondiente. – phoog

17

Prefiero Typed Factory en lugar de usar contenedor como localizador de servicios. Basta con definir la interfaz de fábrica:

public interface IFooFactory { 
    IFoo Create(int somenumber); 
} 

y registrarlo como fábrica escrito:

container.Register(Component.For<IFooFactory>().AsFactory()); 

A continuación, utilice la inyección de dependencias para inyectar fábrica y usarlo:

var foo = fooFactory.Create(desiredArgumentValue); 

Para obtener más información read Windsor documentation

+0

Buena respuesta. ¿Significa que si uso esta fábrica, siempre debo recordar liberar el objeto después de usarlo? El documento dice: "Recuerde que, de forma predeterminada, todos los componentes de Windsor son únicos y que el uso de contenedor de política de lanzamiento predeterminado hace referencia a todos los componentes, incluso los transitorios. Por eso es importante liberar los componentes a través de la fábrica mecanografiada. componentes resueltos a través de la instalación. " –

+0

Sí, es la mejor práctica. Puede definir el método 'void Destroy (IFoo component)' en la interfaz de fábrica para este fin, o implementar 'IDisposable' en su componente y deshacerse de él. Entonces será lanzado. –

Cuestiones relacionadas