2011-11-18 8 views
8

Immaginiamo di avere una classeCome iniettare argomento del costruttore dal file di configurazione con Unity

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

e app.config (o web.config)

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

È ci modo per registrare tipo MyClass in Unity container e point Unity per iniettare il valore per il parametro val constructor dal file di configurazione?

+0

possibile duplicato di [In Unity config, come passare connectionString a un costruttore?] (http://stackoverflow.com/questions/4252231/ in-unity-config-how-to-pass-connectionstring-to-a-constructor) –

risposta

6

è molto facile.

C# Codice:

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

file di configurazione:

<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

Dove si trova il riferimento all'appSetting denominato "value" in questo file di configurazione? – brentlightsey

+0

: attributo "valore" qui. –

+0

Non c'è alcun riferimento a un file di configurazione. Quindi come mappare il file di configurazione o solo da ? –

5

Se si utilizza config XML è possibile farlo attraverso la definizione di un interno che gestisce AppSettings come parametri Unity, vedere http://www.neovolve.com/2010/04/23/appsetting-parameter-injection-in-unity-2/.

In alternativa, se si sta facendo la configurazione C# è possibile utilizzare un costruttore di iniezione come segue ...

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

Il motivo per utilizzare il valore AppSettings piuttosto che la stringa direttamente nella configurazione XML è che centralizza tutti i valori dei parametri in AppSettings e semplifica le migrazioni tra gli ambienti.

+0

perché 'RegisterType ()' funzione tipo registro specificare due nomi della stessa classe? – Mou

+0

La registrazione XML originale dice type, mapTo con lo stesso tipo in entrambi, quindi lo stavo riproducendo. Per la registrazione fluente, sei corretto non hai bisogno del secondo valore; in genere tuttavia si ha RegisterType

3

piuttosto un vecchio post, ma ho pensato che le seguenti informazioni potrebbe essere utile nel caso in cui non è un valore per un tipo nativo, ma un tipo di dati complessi, invece:

<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 po ' più dettagliato qui descritto: http://postlabs.blogspot.com/2015/05/injecting-non-native-data-type-via.html

Problemi correlati