Autofac模块扫描适用于各种应用

时间:2012-04-04 20:34:36

标签: asp.net-mvc architecture dependency-injection autofac

假设您正在开发一个ASP.NET MVC项目,它是在一个解决方案中分成不同项目的层。每个项目都创建了autofac模块,用于连接依赖项。现在,我想扫描程序集并将所有模块注册到容器中。

我采用了类似于此处共享的扩展方法http://goo.gl/VJEct

public static void RegisterAssemblyModules(this ContainerBuilder builder, Assembly 
assembly)
{
  var scanningBuilder = new ContainerBuilder();

  scanningBuilder.RegisterAssemblyTypes(assembly)
    .Where(t => typeof(IModule).IsAssignableFrom(t))
    .As<IModule>();

  using (var scanningContainer = scanningBuilder.Build())
  {
    foreach (var m in scanningContainer.Resolve<IEnumerable<IModule>>())
      builder.RegisterModule(module);
  }
}

我的第一个问题,考虑到这个样本是几年前提供的,这仍然是一个可行的构造,可以与当前版本的autofac一起使用吗?

其次,MVC应用程序依赖于其他层中的功能,这意味着有时我需要使用.InstancePerHttpRequest()注册类型。但是,我还希望能够从非Web应用程序引用它们,而不是依赖于System.Web。注册可以在这些不同环境中使用的模块的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我不会在容器中注册模块。我认为没有理由这样做。

这是alternative

它使用Activator.CreateInstance创建模块并在构建器中注册它们。

相同的框架还为您提供免配置注册支持。只需在服务中添加一个属性:

[Component]
public class MyService : IService
{
}

运行构建器扩展方法:

builder.RegisterAllComponents(Assembly.GetExecutingAssembly());