短い質問:この未回答の問題と同じ
長い質問:
Autofacを使用していたMVC 4 + Web Apiソリューションから、Autofacを使用しているがWeb Api 2のみを使用している新しいソリューションにいくつかのコードを移植しました(MVC 5.1プロジェクトではなく、Web APIのみ)。
以前のソリューションでは、MVC4 と Web Api があったため、それぞれに 1 つずつ、2 つの Bootstrapper.cs ファイルがありました。新しいプロジェクトの Web Api ブートストラップだけをコピーしました。
現在、新しいソリューションには、依存関係をプルする必要がある 2 つのプロジェクトがあります。DependencyResolver.Current.GetService<T>()
アンチパターンであるにもかかわらず、使用する必要があると仮定しましょう。
最初は、MVC 依存関係リゾルバーを同じコンテナーに設定するまで、これは機能しませんでした:
GlobalConfiguration.Configuration.DependencyResolver =
new AutofacWebApiDependencyResolver(container);
//I had to pull in Autofac.Mvc and Mvc 5.1 integration but this line fixed it
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
奇妙な部分は、それらのプロジェクトの 1 つだけで修正されたことです。状況は次のとおりです。
Solution.Web project
Bootstrapper.cs that registers both dependency resolvers for web api and mvc.
Solution.ClassLib project
var userRepo = DependencyResolver.Current.GetService<IUserRepo>(); //Good! :)
Solution.WindowsWorkflow project
var userRepo = DependencyResolver.Current.GetService<IUserRepo>(); //Throws exception :(
例外は次のとおりです。HttpContext が使用できないため、要求の有効期間スコープを作成できません。
ワークフローのせいにする前に、ワークフローが DependencyResolver をうまく使用できた別のソリューションで、この正確な設定がうまく機能していたことを知っておいてください。したがって、これはAutofacの新しいバージョンの使用と、ワークフローが非同期で実行されるという事実に関係していると思われます(非同期コードに関してリンクした質問と同じように)
InstancePerLifetimeScope()
代わりに使用するすべての登録コードを切り替えてInstancePerHttpRequest()
、スコープを作成しようとしました:
using (var c= AutofacDependencyResolver.Current
.ApplicationContainer.BeginLifetimeScope("AutofacWebRequest"))
{
var userRepo = DependencyResolver.Current.GetServices<IUserRepo>();
}
しかし、それは例外を変更しませんでした。コードをさらに分解すると、正確な犯人は次のとおりです。
var adr = AutofacDependencyResolver.Current; //Throws that exception
これを乗り越える必要があり、立ち往生する時間がかかりすぎました。2 日以内に既存の回答に報奨金が与えられます