2010-10-05 8 views
2

J'ai une classe générique (GenericClass) qui dépend d'un type générique (IGenericDependency). Cette dépendance est également générique.Résolution des dépendances en fonction du type générique - Autofac

public class GenericClass<T> 
{ 
     private readonly IGenericDependency; 
} 

Le paramètre de type n'est pas connu avant l'exécution.

Jusqu'à présent, je l'ai fait ceci:

Je l'injection d'un Func.

public class GenericClass<T> : IGenericClass<T> where T:class , new() 
{ 
     private readonly IGenericDependency _genericDependency; 

     public GenericClass(Func<TypeIGenericDependency>> factory) 
     { 
      _genericDependency = factory(T); 
     } 
} 

Et le code reistration:

builder.RegisterGeneric(typeof (GenericClass<>)).As(typeof (IGenericClass<>)); 

    builder.Register<Func<Type, IGetDataCollection>>(c => 
    { 
     var context = c.Resolve<IComponentContext>(); 
     return type => 
       { 
        if(type.Name.EndsWith("Entity")) 
        { 
         return (IGenericDependency) 
          context.Resolve(typeof (GetEntityCollection<>) 
          .MakeGenericType(type)); 
        } 
        if(type.Name.EndsWith("TypedList")) 
        { 
         return (IGenericDependency) 
          context.Resolve(typeof (GetTypedList<>) 
          .MakeGenericType(type)); 
        } 
        throw new NotSupportedException("Not supported type"); 
       }; 
    }); 

Je me demande s'il y a une autre façon de le faire.

Répondre

3

Si vous utilisez une construction récente, vous pouvez utiliser IGenericDependency générique, par ex. IGenericDependency<T> utilisent alors des contraintes de type générique pour discriminer entre les mises en œuvre:

public class GetTypedList<T> : IGenericDependency<T> 
    where T : TypedList { 
} 

public class GetEntity<T> : IGenericDependency<T> 
    where T : Entity { 
} 

GenericClass<T> dépend alors directement sur IGenericDependency<T>.

Tant que TypedList et Entity sont des types mutuellement exclusifs, Autofac choisira l'implémentation correcte.

HTH

+0

Wow, je savais qu'il doit y avoir une solution :-) Cela permet d'économiser plus propre beaucoup de code. Devrait être comme un exemple dans le wiki. – user137348

Questions connexes