假设您正在开发一个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。注册可以在这些不同环境中使用的模块的最佳方法是什么?
答案 0 :(得分:0)
我不会在容器中注册模块。我认为没有理由这样做。
这是alternative。
它使用Activator.CreateInstance
创建模块并在构建器中注册它们。
相同的框架还为您提供免配置注册支持。只需在服务中添加一个属性:
[Component]
public class MyService : IService
{
}
运行构建器扩展方法:
builder.RegisterAllComponents(Assembly.GetExecutingAssembly());