Dai un'occhiata al Unity documentation.
Per un file di configurazione più leggibile si dovrebbe definire il tipo di alias per IFoo
, FooOne
, FooTwo
, ClassOne
e ClassTwo
. Quindi è necessario registrare i mapping da IFoo
alle implementazioni. È necessario impostare un name
per i mapping. Per i consumatori di IFoo
è necessario registrare uno InjectionConstructor
.
propria configurazione sarà simile a questo:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<alias alias="IFoo" type="UnityConfigFile.IFoo, UnityConfigFile" />
<alias alias="FooOne" type="UnityConfigFile.FooOne, UnityConfigFile" />
<alias alias="FooTwo" type="UnityConfigFile.FooTwo, UnityConfigFile" />
<alias alias="ClassOne" type="UnityConfigFile.ClassOne, UnityConfigFile" />
<alias alias="ClassTwo" type="UnityConfigFile.ClassTwo, UnityConfigFile" />
<container>
<register type="IFoo" name="1" mapTo="FooOne" />
<register type="IFoo" name="2" mapTo="FooTwo" />
<register type="ClassOne" mapTo="ClassOne">
<constructor>
<param name="foo">
<dependency type="IFoo" name="1" />
</param>
</constructor>
</register>
<register type="ClassTwo" mapTo="ClassTwo">
<constructor>
<param name="foo">
<dependency type="IFoo" name="2" />
</param>
</constructor>
</register>
</container>
</unity>
</configuration>
Questo è il prova corrispondente che mostra come funziona.
UnityConfigurationSection config =
(UnityConfigurationSection) ConfigurationManager.GetSection("unity");
IUnityContainer container = new UnityContainer();
container.LoadConfiguration(config);
ClassTwo two = container.Resolve<ClassTwo>();
Assert.IsInstanceOfType(two.Foo, typeof(FooTwo));
Aggiornamento
In fase di esecuzione si può fare in questo modo
IUnityContainer container = new UnityContainer();
container.RegisterType<IFoo, FooOne>("One");
container.RegisterType<IFoo, FooTwo>("Two");
container.RegisterType<ClassOne>(new InjectionConstructor(
new ResolvedParameter<IFoo>("One")));
container.RegisterType<ClassTwo>(new InjectionConstructor(
new ResolvedParameter<IFoo>("Two")));
fonte
2012-10-30 10:00:20
Nella mia applicazione, abbiamo predefinita implementazione dell'interfaccia e che sia registrato con Unity. Ma i consumatori sono liberi di avere la propria implementazione e registrarla usando 'app.config'. Puoi dire come gestire questo caso? Come garantire che venga utilizzato quello non predefinito se uno di questi tipi viene registrato? – Learner
Controlla la risposta di @SebastianWeber per i dettagli sull'utilizzo dei file di configurazione per registrare i tuoi servizi. – Fenton
Grazie per la risposta. Ma quella risposta non mi è utile.Perché voglio assicurarmi che l'istanza predefinita registrata con Unity sia "non registrata" e che sia sempre fornita quella configurata dall'utente. – Learner