2010-02-11 4 views
6

J'utilise Unity et Unity.AutoRegistration. Cette ligne pour l'unité:Utilisation de Unity, Comment auto-enregistrer une classe générique avec une interface générique sans enregistrer tout type

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

enregistre efficacement toutes les classes dans le projet de IAction/Action:

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

Mais, je ne veux que des objets spécifiques à enregistrer. Comment ferais-je cela? Ma conjecture est d'ajouter un décorateur d'attribut personnalisé aux classes spécifiques.

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

Et essayez d'utiliser Unity.AutoRegistration. C'est là que je suis coincé à:

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

Répondre

6

Inclure méthode a une surcharge qui vous permet de passer lambda pour enregistrer votre type. Pour obtenir exactement ce que vous voulez avec les attributs que vous pouvez faire comme ceci:

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

En outre, le premier argument de la méthode Inclure est prédicats, donc si vous ne voulez pas utiliser des attributs, mais un autre mécanisme pour définir les types de inclure ou exclure, vous pouvez faire comme ceci:

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

C'est exactement ce dont j'avais besoin! Merci pour l'exemple. – Jaguir

+0

Je ne pense pas qu'il existe un moyen de le faire dans la configuration avec Unity 2.0? –

Questions connexes