StructureMap の現在のバージョンは、ASP .Net Web API、MVC 4、および .NET Framework 4.5 をサポートしていますか?
2 に答える
hereで概説されているように、Web API は依存関係リゾルバーを使用します。
class StructureMapDependencyResolver : IDependencyResolver
{
public IDependencyScope BeginScope()
{
return this;
}
public object GetService(Type serviceType)
{
return ObjectFactory.GetInstance(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return ObjectFactory.GetInstances(serviceType);
}
public void Dispose()
{
}
}
そして、Global.asax.cs に次の行を含めて、依存関係リゾルバーを登録します。
GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver();
それとは別に、新しい Web API は IoC コンテナーで非常に使いやすいです。
まだ調べていませんが、BeginScope
空欄にしたメソッドは子コンテナでも使えると思います。
編集:
上記の実装はうまく機能します。実際、私はこれから説明する代替案よりもそれを好みます。これは、StructureMap の能力を最大限に活用して任意のタイプを解決し、何か問題が発生するたびにエラーをスローします。私はエラーを見るのが好きです。
ただし、API は、GetService
何か問題が発生した場合に null を返すことを想定しています。したがって、API に準拠するために、これが推奨される実装です。
public object GetService(Type serviceType)
{
if (serviceType.IsAbstract || serviceType.IsInterface)
return ObjectFactory.TryGetInstance(serviceType);
else
return ObjectFactory.GetInstance(serviceType);
}
違いはTryGetInstance
、コンテナーに登録されている型のみを検索し、問題が発生した場合は null を返すことです。serviceType.IsAbstract || serviceType.IsInterface
どの方法を使用するかを決定するのに十分なチェックと見なされます。私の最初の回答は単純明快なものを意図していましたが、@PHeiberg はここのコメントで、それが完全に「正しい」わけではないと指摘しています。知識が得られたので、最善と思われるものを使用してください。
ASP.NET Web API リリース バージョンは、依存関係リゾルバー ( IDependencyResolverインターフェイスの実装) を使用し、依存スコープ ( IDependencyScopeインターフェイスの実装) という新しい概念も導入しています。IDependencyScope を適切に実装することが重要です。適切に実装すると、IDependencyScope が破棄されたときに (スコープ内で作成された) リソースを解放できます。そして、リクエストが終了すると破棄されます。
IDependencyScope は、コンテナーがネストされた (または子) コンテナーをサポートしている場合に最適に機能します。StructureMap はバージョン 2.6.1 からそれを行います。
Web API で StructureMap を構成する方法の記事を書きました: ASP.NET WebAPI で StructureMap を構成する
また、Mike Wasson の記事を確認することもできます: Web API 依存関係リゾルバーの使用