16

El marco de inyección de dependencias de Unity de Microsoft se puede configurar mediante código o mediante el archivo de configuración de aplicaciones (app.config).¿Se debería configurar Unity en el código o archivo de configuración?

ejemplo Código:

IUnityContainer container = new UnityContainer() 
    .RegisterType<IInterface, ConcreteImplementation>(); 

Ejemplo de configuración:

<unity> 
    <containers> 
     <container> 
      <types> 
       <type type="IInterface, MyAssembly" 
         mapTo="ConcreteImplementation, MyAssembly" /> 

¿Cuáles son las ventajas/desventajas de cada enfoque? Puedo pensar en la ventaja obvia "Los usuarios pueden configurar fácilmente su aplicación", y la desventaja obvia "Los usuarios pueden romper fácilmente su aplicación", pero ¿hay algo menos obvio?

+0

Duplicado: http://stackoverflow.com/questions/2512316/ioc-dependency-injection-please-explain-code-versus-xml –

+0

No es un duplicado. Esa pregunta se refiere a cómo puede usar la configuración basada en código. Mi pregunta es por qué: cuáles son las compensaciones/beneficios. –

+0

De acuerdo, es justo, intentaré responder en su lugar. –

Respuesta

31

La configuración XML solo es beneficiosa para una sola cosa: Enlace tardío. Con la configuración XML, puede cambiar cómo se compone su aplicación sin volver a compilar toda la aplicación. Esto es particularmente relevante para las aplicaciones de ISV que admiten un grado de configuración de usuario. Los ISV pueden enviar una aplicación compilada con comportamiento predeterminado, pero permiten a los clientes/usuarios cambiar partes del comportamiento cambiando la configuración.

Sin embargo, la configuración XML es frágil y detallada. Desde el punto de vista de un desarrollador, es un dolor trabajar con él.

  • La configuración tiende a romperse cuando cambia el nombre de tipos o conjuntos.
  • Tiene que copiar manualmente los .dlls apropiados al directorio de salida (o hacer que un script de compilación lo haga).
  • La verbosidad general hace que sea difícil trabajar con ella.
  • El soporte de la herramienta es más débil que el del código fuertemente tipado.

Como regla general, prefieren Código como configuración. Sin embargo, puede hacer coincidir el Código como configuración con la configuración XML, por lo que si tiene algunas dependencias que deberían estar vinculadas con retraso, puede usar la configuración XML para esas.

+0

Eso es bueno. Instintivamente prefiero el código, y esa es una explicación clara de por qué. Tenemos un par de servicios web que podríamos querer vincular de forma tardía, por lo que solo tendremos un par de entradas XML. –

+0

ISV significa "proveedor de software independiente". También es posible escribir un formulario simple que produzca/edite esas configuraciones con límite de tiempo, al menos evitando errores tipográficos del usuario. – GregC

2

pregunta ya está contestada pero quiero resumir mi experiencia:

Uso ambos. Oculto la configuración de código en la extensión, cuando tengo varias configuraciones estándar (generalmente, porque uso IoC), tengo varias extensiones que comparten la configuración principal.

Estoy usando la configuración XML para tareas no estándar como la optimización del rendimiento (en el entorno donde la recopilación lleva mucho tiempo).

9

Una desventaja significativa de configuración a través de código es el código requiere una referencia a los conjuntos. Esto significa que tengo que agregar referencias de proyecto o DLL en el proyecto para que el código se compile.

La inyección de dependencia se supone que eliminar las dependencias entre los componentes. La inicialización a través del código reintroduce la dependencia requiriendo referencias de proyecto o DLL. El archivo de configuración xml puede hacer referencia a cualquier ensamblaje.

Si creo una nueva implementación basada en una interfaz, puedo integrar la nueva implementación en una aplicación existente agregando la DLL compilada y actualizando el archivo de configuración xml. Si hago la configuración a través del código, tengo que volver a compilar la aplicación para reemplazar una implementación.

+3

Eliminar dependencias es más que eliminar 'dependencias dll'. se trata de la separación de preocupaciones y SRP. Ser capaz de cambiar los componentes sin compilar es bueno, pero está lejos de ser esa importante OMI en el esquema más amplio de las cosas –

Cuestiones relacionadas