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

时间:2010-10-05 07:46:36

标签: autofac

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

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

直到运行时才知道type参数。

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

我正在注射一个Func。

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

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

注册码:

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

我想知道是否有另一种方法可以做到这一点。

1 个答案:

答案 0 :(得分:3)

如果您使用的是最新版本,则可以使用make IGenericDependency generic,例如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