2010-02-11 30 views
6

Estoy usando Unity y Unity.AutoRegistration. Esta línea de la Unidad:Usando Unity, ¿Cómo registro automáticamente una clase genérica con una interfaz genérica sin registrar CADA tipo?

unityContainer.RegisterType(typeof(IAction<>), typeof(Action<>)); 

registra con eficacia todas las clases en el proyecto para IAction/Acción:

unityContainer.RegisterType<IAction<ObjectA>, Action<ObjectA>>(); 
unityContainer.RegisterType<IAction<ObjectB>, Action<ObjectB>>(); 
unityContainer.RegisterType<IAction<ObjectC>, Action<ObjectC>>(); 
[...] 
unityContainer.RegisterType<IAction<UnrelatedObject>, Action<UnrelatedObject>>(); 
[...] 

Pero, sólo quiero objetos específicos para ser registrados. ¿Como podría hacerlo? Mi suposición es agregar un decorador de atributos personalizado a las clases específicas.

[ActionAtribute] 
public class ObjectB 
{ [...] } 

Y trate de usar Unity.AutoRegistration. Aquí es donde estoy atascado en:

unityContainer.ConfigureAutoRegistration() 
    .Include(If.DecoratedWith<ActionAtribute>, 
      Then.Register() 
      .As ?? // I'm guessing this is where I specify 
      .With ?? // IAction<match> goes to Action<match> 
      ) 
    .ApplyAutoRegistration(); 

Respuesta

6

Incluir método tiene sobrecarga que le permite pasar lambda para registrar su tipo. Para conseguir exactamente lo que quiere con los atributos que puede hacer así:

 unityContainer.ConfigureAutoRegistration() 
      .Include(If.DecoratedWith<ActionAtribute>, 
        (t, c) => c.RegisterType(typeof(IAction<>).MakeGenericType(t), typeof(Action<>).MakeGenericType(t))) 
      .IncludeAllLoadedAssemblies() 
      .ApplyAutoRegistration(); 

Además, el primer argumento de la inclusión del método es predicado, por lo que si usted no desea utilizar atributos sino algún otro mecanismo para definir qué tipos de incluir o excluir, puede hacer esto:

 // You may be getting these types from your config or from somewhere else 
     var allowedActions = new[] {typeof(ObjectB)}; 
     unityContainer.ConfigureAutoRegistration() 
      .Include(t => allowedActions.Contains(t), 
        (t, c) => c.RegisterType(typeof(IAction<>).MakeGenericType(t), typeof(Action<>).MakeGenericType(t))) 
      .IncludeAllLoadedAssemblies() 
      .ApplyAutoRegistration(); 
+0

¡Eso es exactamente lo que necesitaba! Gracias por el ejemplo. – Jaguir

+0

Supongo que no hay forma de hacer esto en la configuración con Unity 2.0. –

Cuestiones relacionadas