Ecco un esempio comune. Devi accedere alla tua domanda. Tuttavia, in fase di progettazione, non si è sicuri che il client desideri accedere a un database, a file o al registro eventi.
Quindi, si desidera utilizzare DI per posticipare tale scelta a una che può essere configurata dal client.
Si tratta di alcuni pseudocodice (o meno sulla base di unità):
Si crea un interfaccia di registrazione:
public interface ILog
{
void Log(string text);
}
quindi utilizzare questa interfaccia nelle classi
public class SomeClass
{
[Dependency]
public ILog Log {get;set;}
}
iniettare quelle dipendenze a runtime
public class SomeClassFactory
{
public SomeClass Create()
{
var result = new SomeClass();
DependencyInjector.Inject(result);
return result;
}
}
e l'istanza è configurato in app.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name ="unity"
type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<typeAliases>
<typeAlias alias="singleton"
type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,Microsoft.Practices.Unity" />
</typeAliases>
<containers>
<container>
<types>
<type type="MyAssembly.ILog,MyAssembly"
mapTo="MyImplementations.SqlLog, MyImplementations">
<lifetime type="singleton"/>
</type>
</types>
</container>
</containers>
</unity>
</configuration>
Ora, se si desidera modificare il tipo di registratore, basta andare nella configurazione e specificare un altro tipo.
Martin Fowler ha la descrizione coperto: http: // Martin Fowler. it/articles/injection.html Per quanto riguarda le risorse .NET, dare un'occhiata a: - [Castle Windsor] (http://www.castleproject.org/container/index.html) - [Spring.NET] (http: //www.springframework.net/) - [Autofac] (http://code.google.com/p/autofac/) - [Ninject] (http://ninject.org/) - [Unity] (http: //www.codeplex.com/unity) - [Structure Map] (http://structuremap.sourceforge.net/) – Codebrain
Dai uno sguardo ai seguenti articoli che possono fornire qualche aiuto su questo: * [Windsor IoC Container on a Pausa pranzo] (http://jeremyjarrell.com/archive/2007/07/12/44.aspx) * [Articolo MSDN su Inversion of Control and Dependency Injection] (http://msdn.microsoft.com/en-us/library/aa973811.aspx) Link generale sul contenitore: * [Progetto castello] (http: // www .castleproject.org/container/index.html) Un paio di link SO che possono aiutare ulteriori cose sull'argomento: * [Domande Castle Windsor] (http://stackoverflow.com/questions/tagged/castle-windsor) * [ Domande IoC] (http://stackoverflow.com/questions/t –