Aquí hay un ejemplo común. Debes iniciar sesión en tu aplicación. Pero, en el momento del diseño, no está seguro de si el cliente desea iniciar sesión en una base de datos, archivos o el registro de eventos.
Por lo tanto, desea utilizar DI para diferir esa elección a una que pueda ser configurada por el cliente.
Esto es algo de pseudocódigo (más o menos basada en la unidad):
Se crea un interfaz de registro:
public interface ILog
{
void Log(string text);
}
a continuación, utilizar esta interfaz en sus clases
public class SomeClass
{
[Dependency]
public ILog Log {get;set;}
}
inyectar esas dependencias a las tiempo de ejecución
public class SomeClassFactory
{
public SomeClass Create()
{
var result = new SomeClass();
DependencyInjector.Inject(result);
return result;
}
}
y la instancia se configura en 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>
Ahora bien, si desea cambiar el tipo de registrador, que acaba de entrar en la configuración y especifique otro tipo.
Martin Fowler tiene la descripción cubierto: http: // Martin Fowler. com/articles/injection.html En cuanto a los recursos de .NET, eche un vistazo 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) - [Mapa de estructura] (http://structuremap.sourceforge.net/) – Codebrain
Eche un vistazo a los siguientes artículos que pueden brindar ayuda sobre esto: * [Windsor IoC Container en un Lunch Break] (http://jeremyjarrell.com/archive/2007/07/12/44.aspx) * [Artículo de MSDN sobre Inversion of Control and Dependency Injection] (http://msdn.microsoft.com/en-us/library/aa973811.aspx) Enlace general sobre el contenedor: * [Castle Project] (http: // www) .castleproject.org/container/index.html) Un par de enlaces de SO que pueden ayudar a otras cosas sobre el tema: * [Preguntas de Castle Windsor] (http://stackoverflow.com/questions/tagged/castle-windsor) * [ Preguntas sobre la IoC] (http://stackoverflow.com/questions/t –