.net - script - unity static inspector
¿Cuál es la diferencia entre el propósito de MEF y Unity? (2)
Hay muchas opciones para hacer DI. En primer lugar, debe darse cuenta de que DI no se trata de herramientas, sino de patrones y principios. Puedes usar DI sin una herramienta. Si haces eso, lo llamamos DI del Pobre .
Sin embargo, dicho esto, hay muchos Contenedores DI disponibles para .NET . La unidad es solo uno de ellos.
MEF se parece mucho a un DI Container, pero actualmente resuelve un problema diferente: el de la extensibilidad. En lugar de la configuración externa de los componentes (que utilizan todos los Contenedores DI) usa un mecanismo de descubrimiento basado en atributos.
Empecé a estudiar DI (estoy trabajando en WPF / Silverlight pero tengo un plan para pasar a ASP.NET). Después de leer algunos artículos de DI de internet, hay dos Frameworks que me interesan, MEF y Unity. Quiero saber cuál es el mundo real diferente entre ellos y cuál es bueno para ir.
La principal diferencia es que con unity registrarás explícitamente cada clase que quieras usar en la composición:
var container = new UnityContainer();
container.RegisterType<IFoo,Foo>();
container.RegisterType<IBar,Bar>();
...
var program = container.Resolve<Program>();
program.Run();
En MEF, por otro lado, marcas las clases con atributos en lugar de registrarlos en otro lugar:
[Export(typeof(IFoo))]
public Foo
{
...
}
A primera vista, parece una diferencia sintáctica menor, pero en realidad es más importante que eso. MEF está diseñado para permitir el descubrimiento dinámico de partes. Por ejemplo, con DirectoryCatalog
puede diseñar su aplicación de tal forma que pueda ampliarla simplemente colocando nuevas DLL en la carpeta de la aplicación.
En este ejemplo, MEF encontrará e instanciará todas las clases con un atributo [Export(typeof(IPlugin))]
en el directorio dado y pasará esas instancias al constructor del Program
:
[Export]
public class Program
{
private readonly IEnumerable<IPlugin> plugins;
[ImportingConstructor]
public Program(
[ImportMany(typeof(IPlugin))] IEnumerable<IPlugin> plugins)
{
this.plugins = plugins;
}
public void Run()
{
// ...
}
}
Punto de entrada:
public static void Main()
{
using (var catalog = new DirectoryCatalog(".","*"))
using (var container = new CompositionContainer(catalog))
{
var program = container.GetExportedValue<Program>();
program.Run();
}
}
Para acomodarse a tales escenarios de composición dinámica, MEF tiene un concepto de "composición estable", lo que significa que cuando se encuentra con una dependencia faltante en alguna parte simplemente marcará la parte como no disponible y continuará la composición de todos modos.
La composición estable puede ser bastante útil , pero también dificulta la depuración de una composición fallida . Entonces, si no necesita un descubrimiento dinámico de partes y una "composición estable", usaría un contenedor DI regular en lugar de MEF. A diferencia del MEF, los contenedores DI regulares le darán mensajes de error claros cuando falte una dependencia.
También es posible obtener lo mejor de ambos mundos utilizando un contenedor DI que se integra con MEF, como Autofac . Use Autofac para componer la aplicación principal y MEF para las partes que deben ser dinámicamente extensibles.