2010-02-11 3 views
6

Sto utilizzando Unity e Unity.AutoRegistration. Questa linea per l'Unità:Utilizzo di Unity, Come autoregistrare una classe generica con un'interfaccia generica senza registrarvi OGNI tipo

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

registra in modo efficace ogni classe nel progetto per IAction/Azione:

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

Ma, voglio solo oggetti specifici da registrare. Come potrei farlo? La mia ipotesi è di aggiungere un decoratore di attributi personalizzati alle classi specifiche.

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

E provare a utilizzare Unity.AutoRegistration. Questo è il punto in cui sono bloccato:

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(); 

risposta

6

Includi il metodo ha un sovraccarico che consente di passare lambda per registrare il tuo tipo. Per ottenere esattamente quello che vuoi con gli attributi che si può fare in questo modo:

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

Inoltre, il primo argomento di inserire il metodo è predicato, quindi se non si desidera utilizzare gli attributi, ma qualche altro meccanismo per definire quali tipi di includi o escludi, puoi fare così:

 // 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

Questo è esattamente ciò di cui avevo bisogno! Grazie per l'esempio. – Jaguir

+0

Non credo che ci sia un modo per farlo nella configurazione usando Unity 2.0? –