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に依存しないこともできます。これらの異なる状況で使用できるモジュールを登録するための最良の方法は何ですか?
を...それでも好奇心。 mvcを参照せずにMVCアプリケーションモジュールをうまく結びつけることができましたか?また、httpリクエストのライフタイムスコープで適切に使用できることはありますか?私は今あなたと同じ状況を抱えています。オプションは次のとおりです。web prjのすべてのモジュール登録または各アセンブリのモジュール登録... –
これまでは、必要に応じて各アセンブリでモジュールのアプローチを取りました。この投稿以降、autofacは、そのコアdllにRegisterAssemblyModules拡張メソッドを組み込んでいます。 https://code.google.com/p/autofac/wiki/Scanning#Module_ScanningどのWebコンポーネントも参照していないプロジェクトでは、ほとんどの一般的なケースでInstancePerDependency()としてコンポーネントを登録しています。私はメインプロジェクトで1つの大きな登録を避けるようにしています。私はあなたがそのようなやり方で多少の柔軟性をあきらめたり、 "面倒な"登録設定でさえ気にすることができることを知っています。 – cecilphillip
良い情報。問題はEntity Framework DBContextを登録して(私はいくつかの限定されたコンテキストでDDDを行う)、それらをリポジトリに注入したいときです。あなたはそれらにlifetimescopeをwebrequestとして持たせたいと思っています。これにより私はAutoFac(thats ok)、AutoFac MVC intergration(Hmm .. maybe ok)、MVC Web prj(Not OK)を参照するようになりました。私のプロジェクトの他のコンポーネントは、実際に寿命の範囲を指定していないので、PerDependencyです。私は実際にInstancePerMatchingLifetimeScope( "AutofacWebRequest")でDBContextを配線することができることを発見しました。私はその醜い参照を知っています。 –