3

假设您正在处理一个 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。注册可在这些不同上下文中使用的模块的最佳方法是什么?

4

1 回答 1

0

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

这是一个替代方案

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

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

[Component]
public class MyService : IService
{
}

并运行构建器扩展方法:

builder.RegisterAllComponents(Assembly.GetExecutingAssembly());
于 2012-04-05T05:39:47.587 回答