2011-11-18 15 views
8

Imaginemos que tenemos una claseCómo inyectar argumento del constructor del archivo de configuración con Unity

public class MyClass 
{ 
    private string _val; 
    public MyClass(string val) 
    { 
     _val = val; 
    } 
} 

y app.config (o web.config)

<appSettings> 
    <add key="value" value="some value" /> 
</appSettings> 

¿Hay manera de registrar el tipo de MiClase Unity container y point Unity para inyectar valor para val constructor parameter from config file?

+0

posible duplicado de [¿En la configuración de Unity, cómo pasar connectionString a un constructor?] (http://stackoverflow.com/questions/4252231/ in-unity-config-how-to-pass-connectionstring-to-a-constructor) –

Respuesta

6

es muy fácil.

C# Código:

var container = new UnityContainer(); 
container.LoadConfiguration(); 
MyClass mc = container.Resolve<MyClass>(); 

archivo de configuración:

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">  
<container> 
    <register type="[namespace].MyClass, [assembly-name]" 
    mapTo="[namespace].MyClass, [assembly-name]"> 
    <constructor> 
     <param name="val" value="Ethan Woo"/> 
    </constructor> 
    </register> 
</container> 

+1

¿Dónde se denomina "valor" a la appSetting en este archivo de configuración? – brentlightsey

+0

: atributo "value" aquí. –

+0

No hay referencia a los archivos de configuración. Entonces, ¿cómo asignar el archivo de configuración o simplemente desde ? –

5

Si está utilizando configuración XML que puede hacer esto mediante la definición de una extensión que maneja AppSettings como parámetros de Unity, ver http://www.neovolve.com/2010/04/23/appsetting-parameter-injection-in-unity-2/.

Alternativamente, si usted está haciendo la configuración # C puede utilizar un constructor de la inyección de la siguiente manera ...

var container = new UnityContainer(); 
container.RegisterType<MyClass>(
    new InjectionConstructor(
     InjectionParameter<string>(ConfigurationManager.AppSettings["value"]))); 

La razón para utilizar el valor AppSettings en lugar de la cadena directamente en la configuración XML es que centraliza todos los valores de parámetros en AppSettings y simplifica las migraciones entre entornos.

+0

¿por qué la función de tipo de registro 'RegisterType ()' especifica dos nombres de la misma clase? – Mou

+0

El registro XML original dice type, mapTo con el mismo tipo en ambos, así que estaba reproduciendo eso. Para el registro fluido, tiene razón, no necesita el segundo valor; típicamente, sin embargo, usted tiene RegisterType

3

Muy a una entrada antigua, pero pensé que la siguiente información podría ser útil en caso de que no es un valor para un tipo nativo, sino un tipo de datos en su lugar:

<configuration> 
 

 
    <configsections> 
 
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"> 
 
    </section> 
 
    </configsections> 
 

 
    <unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> 
 

 
    <alias alias="IRepository" type="UnityTest.IRepository, UnityTest"> 
 
     <alias alias="Repository" type="UnityTest.Repository, UnityTest"> 
 

 
     <container> 
 
      <register mapto="Repository" type="IRepository"> 
 

 
      <register name="MyClass" type="UnityTest.MyClass, UnityTest"> 
 
       <constructor> 
 
       <param name="repository" type="IRepository"> 
 
       <dependency name="IRepository"> 
 

 
       </dependency> 
 
       </constructor> 
 
      </register> 
 

 
      </register> 
 
     </container> 
 

 
     </alias> 
 
    </alias> 
 
    </unity> 
 

 
</configuration>

Un poco más detallada descrita aquí: http://postlabs.blogspot.com/2015/05/injecting-non-native-data-type-via.html

Cuestiones relacionadas