2010-02-17 23 views
10

Personalmente me gusta la opción de configurar StructureMap desde el código C#. Por lo que entiendo, una de las ventajas de DI es que podemos intercambiar fácilmente una nueva instancia concreta. Pero, si la configuración está definida en código, entonces las instancias concretas están codificadas en el dll.Configuración Xml o Configuración a través del código?

Así que, prácticamente, es tan bueno como haber codificado las dependencias, ¿verdad? Lo sé, durante las pruebas hace la vida más fácil ...

Mi punto es, ¿no sería mejor usar la configuración xml en su lugar? ¿Quieres agregar una nueva instancia concreta? simplemente haga que su instalador sobrescriba el archivo structuremap.config con el nuevo.

Entonces, ¿cuál es la forma preferida de configurar StructureMap?

Extra: Estoy forzado a usar la configuración C# por el momento porque no sé cómo pasar la cadena de conexión a la instancia. Puedo escribir la conexión en el archivo de configuración, pero me gustaría reutilizar la conexión definida en app.config.

Respuesta

17

Independientemente del contenedor DI particular que utilice, siempre debe diferir la resolución del gráfico de objetos de la aplicación al last responsible moment. Esto se llama solicitud Composition Root.

Puede escribir la mayor parte de su solicitud without ever referencing the DI Container. Esto también significa que puede diferir la decisión entre configuración en código o configuración hasta que la necesite.

Usted shouldn't need the container at all for unit testing, pero puede necesitarlo para las pruebas de integración. Sin embargo, en las pruebas de integración, es probable que necesite una configuración diferente para el contenedor que en la aplicación final.

En general, la configuración del contenedor en código es el enfoque preferido hoy en día porque es más robusto y se puede aplicar la mecánica de configuración basada en la convención.

La configuración XML tiende a ser más frágil y demasiado detallada. En la mayoría de los casos, simplemente lo ralentiza porque no obtiene refactorización ni compatibilidad con el compilador.

Sin embargo, la configuración XML sigue siendo válida cuando necesita poder intercambiar dependencias sin volver a compilar la aplicación. La mayoría de Contenedores DI le permitirá mezclar esos enfoques para que pueda tener la mayor parte de su configuración en el código, pero algunas dependencias seleccionadas definidas en XML por razones de extensibilidad.

+0

hmm ... que suena razonable. ¡¡Gracias!! –

+0

Aunque estoy de acuerdo con su respuesta. Parece que la pregunta realmente es cómo puedo obtener la configuración de mi aplicación en mis tipos. – KevM

+0

@KevM, no realmente. Mi pregunta era más sobre qué opción de configuración es mejor. Surgió porque estaba teniendo dificultades para conectar mi cadena de conexión a mis tipos usando xml. Tendría que haber escrito la cadena de conexión una vez más en el archivo structuremap.config. Quería evitar tener que mantener la conexión en dos lugares. –

6

Para responder a su pregunta, puede tener su pastel y comérselo también en StructureMap. Puede configurar su contenedor desde el código e insertar ese bit adicional de configuración que necesita desde la configuración de la aplicación. Eso es lo que EqualToAppSetting es para.

crear una clase de configuración

public class DatabaseSettings 
{ 
    public DatabaseSettings(string type, string connectionString) 
    { 
     Type = type; 
     ConnectionString = connectionString; 
    } 

    public string Type { get; set; } 
    public string ConnectionString { get; set; } 
} 

Siguiente diga StructureMap configurarlo usando la configuración de la aplicación.

 [Test] 
    public void setup_concrete_class_via_application_configuration() 
    { 
     var container = new Container(config => 
     { 
      config.ForConcreteType<DatabaseSettings>().Configure 
       .Ctor<string>("type").EqualToAppSetting("dovetail.database.type", "mssql") 
       .Ctor<string>("connectionString").EqualToAppSetting("dovetail.database.connectionString"); 

     }); 

     var databaseSettings = container.GetInstance<DatabaseSettings>(); 
     databaseSettings.Type.ShouldEqual("mssql"); 
     databaseSettings.ConnectionString.ShouldEqual("Data Source=.; Initial Catalog=dovetail;User Id=sa;Password=sa;"); 
    } 

Finalmente aquí es lo que los parámetros de la aplicación se parecen en mi config aplicación:

<appSettings> 
    <add key="dovetail.database.type" value="mssql"/> 
    <add key="dovetail.database.connectionString" value="Data Source=.;Initial Catalog=dovetail;User Id=sa;Password=sa;"/>  
</appSettings> 
+0

Pensé en esto, pero la desventaja para mí fue que tendría que rastrear la conexión en dos lugares. uno aquí y otro en la sección connectionstring de la web/app.config ... Gracias por la respuesta :) –

+0

estoy usando su sugerencia en este momento para resolver mi problema con la cadena de conexión. Al inicio de la aplicación edito web.config para incluir una nueva configuración de aplicación llamada connectionString. Obtiene su valor del connectionString definido en la sección connectionStrings adecuada. Por lo tanto, tengo que modificar la cadena de conexión solo en un lugar. y mi configuración de StructureMAP puede leerlo desde los appsets ... ¡gracias! –

+0

Feliz de ayudar. Hicimos una forma de extraer de manera convencional la configuración en los objetos de configuración para evitar cualquier configuración de contenedor. Debo realmente blog sobre eso. – KevM

Cuestiones relacionadas