根据泛型类型解决依赖关系 - Autofac

问题描述:

我有一个泛型类(GenericClass),它具有依赖性,具体取决于泛型类型(IGenericDependency)。这种依赖也是通用的。根据泛型类型解决依赖关系 - Autofac

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

直到运行时才知道类型参数。

到目前为止,我已经做到了这一点:

我注射Func键。

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

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

而且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"); 
       }; 
    }); 

我不知道是否有另一种方式来做到这一点。

如果您使用的是最近的版本,您可以使用通用的例如。 IGenericDependency<T>然后使用通用类型的约束的实现之间进行区分:

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

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

GenericClass<T>然后直接取决于IGenericDependency<T>

只要TypedListEntity是互斥类型,Autofac将选择正确的实现。

HTH

+0

哇,我知道一定是有整洁的解决方案:-)这节省了大量的代码。应该作为维基的一个例子。 – user137348 2010-10-06 09:13:34