2012-04-04 93 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