Asp.net mvc 用于各种应用的Autofac模块扫描

Asp.net mvc 用于各种应用的Autofac模块扫描,asp.net-mvc,architecture,dependency-injection,autofac,Asp.net Mvc,Architecture,Dependency Injection,Autofac,假设您正在处理一个ASP.NET MVC项目,它是在一个解决方案中分为不同项目的层。每个项目都创建了autofac模块以连接依赖项。现在,我想扫描程序集并将所有模块注册到容器中 我采用了一种类似于此处共享的扩展方法 公共静态无效注册表AssemblyModule(此ContainerBuilder生成器,程序集 装配) { var scanningBuilder=new ContainerBuilder(); scanningBuilder.RegisterAssemblyTypes(部件) 其

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

我采用了一种类似于此处共享的扩展方法

公共静态无效注册表AssemblyModule(此ContainerBuilder生成器,程序集
装配)
{
var scanningBuilder=new ContainerBuilder();
scanningBuilder.RegisterAssemblyTypes(部件)
其中(t=>typeof(IModule).IsAssignableFrom(t))
.As();
使用(var scanningContainer=scanningBuilder.Build())
{
foreach(scanningContainer.Resolve()中的var m)
生成器注册表模块(模块);
}
}
我的第一个问题是,考虑到该示例是几年前提供的,这是否仍然是当前版本的autofac使用的可行构造


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

我不会在容器中注册模块。我看没有理由那样做

这是一个例子

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

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

[Component]
public class MyService : IService
{
}
并运行生成器扩展方法:

builder.RegisterAllComponents(Assembly.GetExecutingAssembly());

在您的链接中,RegisterModules方法比我要做的要长一些,但是您正在创建自己的,而不是使用内置的autofac模块支持。。。但还是很好奇。您是否成功地将MVC应用程序模块很好地连接起来,而不必引用MVC,并且您仍然可以在http请求的生命周期内正确使用它们?我现在的处境和你一样。选项是:在web prj中注册所有模块或在每个组件中注册模块…到目前为止,我已经在必要时在每个组件中采用了模块注册的方法。自本文发布以来,autofac在其核心dll中包含了RegisterAssemblyModule扩展方法。对于没有引用任何web组件的项目,我已经在大多数一般情况下将组件注册为InstancePerDependency()。我尽量避免在主项目中进行大量注册。我发现你会放弃一点灵活性,甚至可以放弃“messier”注册设置。好的。好消息。问题是(在我的例子中),当您注册实体框架DBContext(我使用多个有界上下文进行DDD)并希望将它们注入存储库时,您希望它们将lifetimescope作为webrequest。这使我参考了AutoFac(这没问题)、AutoFac MVC集成(嗯……也许可以)和MVC Web prj(不可以)。我的项目中的其他组件实际上没有指定生存期范围,因此它们是相互依赖的。实际上,我发现我可以用InstancePerMatchingLifetimeScope(“AutofacWebRequest”)连接我的DBContext。我知道这是一个丑陋的参考。。。。继续:但对我来说,在其他项目的任何地方都不能引用web项目。因此,我将尝试此解决方案,您可能会编写自己的扩展方法来调用InstancePerMatchingLifetimeScope(“AutofacWebRequest”),以便确保“父”lifetimescope名称正确无误。问题是当您想使用相同的autofac模块注册在非WebContext中使用的DBContext时。。。例如后台批处理。然后,您可能需要使用MultiTenant(尚未查看),或者只需要为批处理使用其他模块。
builder.RegisterAllComponents(Assembly.GetExecutingAssembly());