如何使用Autofac DI动态解析具有相同界面的50多个类

时间:2011-12-02 17:41:08

标签: asp.net-mvc-3 data-annotations autofac

我刚刚开始在大型生产项目中使用Autofac DI。我目前在Asp.Net MVC3中为“正常”情况进行注册和解决。通过这个,我的意思是控制器,业务层,存储库等。

我的问题是我有50多个类都具有相同的界面。我可以给每个类一个独特的接口类型,但这种方法的问题是:

  1. 这非常繁琐,因为所有类别的方法都完全相同
  2. 这似乎违反了编码的所有DRY原则。
  3. 用法是作为对在视图模型中的MVC3 Custom属性上实例化的类的引用。用法是:

    [CustomAttribute(typeof(foo))]
    Public string FooProperty {get;set;};
    

    然后在自定义MVC3 HTML Helper方法中使用此属性,并从[CustomAttribute(typeof(foo))]属性获取要使用的完全限定类型名称(或可以是System.Type)。从类的名称到实例化,Html.Helper方法请求实例化类。在我们将DI添加到应用程序之前,我们使用System.Activator.CreateInstance进行了此操作。

    采用这种方法是因为它解决了应用程序中重用属性信息的其他部分的问题。

    当我看到许多方法时,我会对正确的方法感到困惑。一些指导意见将不胜感激。

1 个答案:

答案 0 :(得分:3)

您不需要从Autofac容器解析接口,也可以解析具体类。这取决于类型注册。您可以通过查找实现特殊界面的类型批量注册50多个类,然后通过“self”注册这些类:

var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(assemblyWithClasses)
    .Where(type => type.IsAssignableTo<IYourSpecialInterface>())
    .AsSelf();
var container = builder.Build();

AsSelf确保您能够通过类名解析,如下所示:

var type = Type.GetType("OneOfThe50PlusClasses");
var instance = container.Resolve(type);