2012-04-04 92 views
3

假设您正在开发一个ASP.NET MVC项目,并且它在单个解决方案中将层分成不同的项目。每个项目都创建了autofac模块来连接依赖关系。现在,我想扫描程序集并将所有模块注册到容器中。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

大约一年前...但还是好奇。您是否设法很好地连接了您的MVC应用程序模块,而无需引用mvc,并且您仍然可以在http请求的生命周期中正确使用它们?我现在和你一样。选项包括:web prj中的所有模块注册或每个程序集中的模块注册... – 2013-10-21 09:00:43

+0

到目前为止,我已经在必要时在每个程序集中采用了模块方法。自从这篇文章以来,autofac在其核心dll中包含了一个RegisterAssemblyModules扩展方法。 https://code.google.com/p/autofac/wiki/Scanning#Module_Scanning。对于没有引用任何Web组件的项目,对于大多数一般情况,我已经很好地将组件注册为InstancePerDependency()。我尽量避免在主项目中进行一次巨大的注册。我发现你会放弃这种方式的灵活性,或甚至可以与“messier”注册设置。 – cecilphillip 2013-10-22 14:45:35

+0

好的。好信息。问题是(对于我的情况),当你注册实体框架DBContexts(我做DDD与几个有界的上下文),并希望将它们注入到存储库,你希望他们有Lifetimecope作为webrequest。这使我引用AutoFac(多数民众赞成),AutoFac MVC集成(嗯..也许确定)和MVC网络prj(不行)。我们项目中的其他组件实际上并未指定生命周期范围,因此它们是PerDependency。我发现我可以用InstancePerMatchingLifetimeScope(“AutofacWebRequest”)连接我的DBContext。我知道它是一个丑陋的参考。 – 2013-10-24 21:55:28

回答

0

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

这是alternative

它使用Activator.CreateInstance创建模块并将其注册到构建器中。

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

[Component] 
public class MyService : IService 
{ 
} 

并运行建设者扩展方法:

builder.RegisterAllComponents(Assembly.GetExecutingAssembly()); 
+0

在你的链接中,RegisterModules方法比我想做的要长一些,但不是使用内置的autofac模块支持你创建自己的。 – cecilphillip 2012-04-05 20:48:59