2010-06-23 6 views
6

Cómo configurar Unity para que cualquier clase derivada de alguna clase base pase por el pipeline de inyección definido para la clase base.Configure Unity Injection para todos los descendientes de alguna clase base

public abstract class Base 
{ 
    public IDependency Dependency {get;set;} 
}; 

public class Derived1: Base 
{ 
}; 

public class Derived2: Base 
{ 
}; 


container.RegisterType<Base>(new InjectionProperty("Dependency", new ResolvedParameter<IDependency>())); 
var d1 = container.Resolve<Derived1>(); 

Por lo tanto, necesito registro clase base con Unity, mientras que las clases derivadas resolver de manera que todas las inyecciones establecidos para la clase de base se aplicarán a las clases derivadas.

La propiedad de la clase base decorativa con DependencyAttribute no está permitida debido a las restricciones de mi proyecto.


Mirror of the question on Unity's codeplex site

+2

Lo que está buscando se llama * autoregistro *, * escaneo * o * registro basado en convenciones *. Muchos Contenedores DI (como Castle Windsor y StructureMap) lo admiten, pero Unity no. ¿Puedo recomendar un mejor contenedor DI? –

+0

Gracias, pero me temo que no es posible cambiar a otro marco DI en este momento. En realidad, estoy buscando BuildUp inteligente en lugar del registro automático de todos mis descendientes. Por supuesto, el registro automático me permitiría alcanzar mi objetivo también. Pero tener en cuenta la herencia sería un comportamiento más apropiado, creo. –

+0

Quizás le resulte útil esta pregunta relacionada (y su respuesta): http://stackoverflow.com/questions/1769056/does-ms-pnp-unity-scan-for-assemblies-like-structuremap –

Respuesta

6
var container = new UnityContainer(); 
container 
    .RegisterType<IDependency, Dependency1>() 
    .RegisterTypes(
     AllClasses 
      .FromAssemblies(Assembly.GetExecutingAssembly()) 
      .Where(t => typeof(Base).IsAssignableFrom(t)), 
     getInjectionMembers: _ => new[] { new InjectionProperty("Dependency") }); 
var d1 = container.Resolve<Derived1>(); 

Nota: se necesita la unidad 3 que soporta Registration by convention.

+0

Estaba soñando con esto en el año 2010 :) –

Cuestiones relacionadas