2012-04-04 8 views
3

ASP.NET MVCプロジェクトで作業していて、レイヤーが1つのソリューションで異なるプロジェクトに分割されているとします。各プロジェクトには、依存関係を結びつけるために作成された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); 
    } 
} 

共有されたものと同様の拡張メソッドを適応オートファクト?

第2に、MVCアプリケーションは他のレイヤーの機能に依存しているため、タイプを.InstancePerHttpRequest()で登録する必要があることを意味します。しかし、Web以外のアプリケーションからそれらを参照し、System.Webに依存しないこともできます。これらの異なる状況で使用できるモジュールを登録するための最良の方法は何ですか?

+0

を...それでも好奇心。 mvcを参照せずにMVCアプリケーションモジュールをうまく結びつけることができましたか?また、httpリクエストのライフタイムスコープで適切に使用できることはありますか?私は今あなたと同じ状況を抱えています。オプションは次のとおりです。web prjのすべてのモジュール登録または各アセンブリのモジュール登録... –

+0

これまでは、必要に応じて各アセンブリでモジュールのアプローチを取りました。この投稿以降、autofacは、そのコアdllにRegisterAssemblyModules拡張メソッドを組み込んでいます。 https://code.google.com/p/autofac/wiki/Scanning#Module_ScanningどのWebコンポーネントも参照していないプロジェクトでは、ほとんどの一般的なケースでInstancePerDependency()としてコンポーネントを登録しています。私はメインプロジェクトで1つの大きな登録を避けるようにしています。私はあなたがそのようなやり方で多少の柔軟性をあきらめたり、 "面倒な"登録設定でさえ気にすることができることを知っています。 – cecilphillip

+0

良い情報。問題はEntity Framework DBContextを登録して(私はいくつかの限定されたコンテキストでDDDを行う)、それらをリポジトリに注入したいときです。あなたはそれらにlifetimescopeをwebrequestとして持たせたいと思っています。これにより私はAutoFac(thats ok)、AutoFac MVC intergration(Hmm .. maybe ok)、MVC Web prj(Not OK)を参照するようになりました。私のプロジェクトの他のコンポーネントは、実際に寿命の範囲を指定していないので、PerDependencyです。私は実際にInstancePerMatchingLifetimeScope( "AutofacWebRequest")でDBContextを配線することができることを発見しました。私はその醜い参照を知っています。 –

答えて

0

私はコンテナにモジュールを登録しません。私はそれをする理由はないと思う。

ここにはalternativeがあります。

Activator.CreateInstanceを使用してモジュールを作成し、ビルダーに登録します。

同じフレームワークでも、構成を無料で登録できます。

[Component] 
public class MyService : IService 
{ 
} 

をそしてビルダー拡張メソッドを実行します:ちょうどあなたのサービスに属性を追加するほぼ一年前

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

あなたのリンクでは、RegisterModulesメソッドは私がやる行のやや長いですが、内蔵のautofacモジュールを使う代わりに独自のものを作成しています。 – cecilphillip

関連する問題