2010-05-13 20 views
36

Estoy usando StructureMap para mi DI. Imagínese que tengo una clase que toma 1 argumento como:Pasando argumentos del constructor al usar StructureMap

public class ProductProvider : IProductProvider 
{ 
    public ProductProvider(string connectionString) 
    { 
     .... 
    } 
} 

necesito especificar el "connectionString en tiempo de ejecución cuando llego a una instancia de IProductProvider

He configurado StructureMap de la siguiente manera.:

ForRequestedType<IProductProvider>.TheDefault.Is.OfConcreteType<ProductProvider>(). 
WithCtorArgument("connectionString"); 

sin embargo, no quiero llamar EqualTo ("algo ...") método de aquí, ya que necesito alguna facilidad para especificar dinámicamente este valor en tiempo de ejecución.

Mi pregunta es: ¿cómo puedo obtener una instancia de IProductProvider utilizando ObjectFactory?

Actualmente, tengo algo como:

ObjectFactory.GetInstance<IProductProvider>(); 

Pero como usted sabe, esto no funciona ...

Cualquier consejo sería muy apreciada.

Respuesta

32

¡Encontré la respuesta yo mismo! Aquí está la solución:

ObjectFactory.With("connectionString").EqualTo(someValueAtRunTime).GetInstance<IProductProvider>(); 

Espero que esto ayude a otros que han tenido el mismo problema.

+1

Asegúrese de que someValueAtRuntime sea un valor simple, no cualquier tipo de Func o Lambda (si puede hacerlo) para recuperarlo, de lo contrario, esa función se ejecutará cada vez que se resuelva la dependencia. Usé este truco para inyectar una cadena de conexión, tal como lo estás haciendo. Siempre que ponga la cadena en una variable local antes de configurar ObjectFactory, debería estar bien. – Mel

+5

Yo. ¿Qué pasa si tengo varios argumentos, arg1, 2, 3 etc. Y quiero pasar cada argumento como está pero mantener uno de los argumentos como nulo. ¿Como hacer esto? –

+0

@Mosh gracias por la respuesta, ¿cómo puedes decirme cómo pasas algúnValueAtRuneTime? un ejemplo de eso, por favor. – wandos

51

Sugiero declarar eso con la configuración de StructureMap. Usando el código ligeramente más reciente StructureMap:

For<IProductProvider>().Use<ProductProvider> 
    .Ctor<string>("connectionString").Is(someValueAtRunTime); 

De esta manera no hace carga su código de cliente de tener que conocer el valor y puede mantener su configuración COI a parte de su código principal.

+1

Supongo que este es el lugar donde configuraste StructureMap. ¿Cómo se pasa el 'someValueAtRunTime' allí? – user1713059

Cuestiones relacionadas