答えて

14

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の能力に解決し、何かがうまくいかなくなったときにエラーを投げます。彼らは私が間違っていたことを私に示すので、私はエラーを見るのが好きです。

しかし、何か問題が生じた場合、GetServiceはnullを返すとAPIは考えています。だから、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はここでのコメントで完全に「正しい」わけではないことを指摘しています。あなたは知識があるので、何が最善のものであれ使用してください。

+0

のStructureMapは、依存関係の解決を処理しません。この例とJeremyのコメントをチェックしてください:http://ardalis.com/How-Do-I-Use-StructureMap-with-ASP.NET-MVC-3 – PHeiberg

+0

実際これは動作します。 Jeremyは 'TryGetInstance'は' serviceType'が明示的に登録されている場合にのみ解決すると言います。 'GetInstance'はまだ登録されていないが具体的な型を解決します。 – kelloti

+0

インスタンスの解決はコードで機能します。しかし、私はジェレミー自身が[それを推奨する]ので、私が提案した "ベストプラクティス"として投稿したリンクを解釈します(http://codebetter.com/jeremymiller/2011/01/23/if-you-are-using-structuremap-with -mvc3-please-read-this /)私はGetServiceメソッドは、型がコンテナによって解決可能でない場合、例外を生成する代わりにnullを返すことになっていると思います。 – PHeiberg

8

ASP.NET Web APIリリースバージョンは依存関係リゾルバ(IDependencyResolverインターフェイスの実装)を使用し、新しい概念依存スコープ(IDependencyScopeインターフェイスの実装)も導入しています。 IDependencyScopeを適切に実装することが重要です。適切に実装されている場合は、IDependencyScopeが配置されたときに(スコープで作成された)リソースを解放できます。要求が終わると処分されます。

IDependencyScopeは、コンテナがネストされた(または子の)コンテナをサポートしているときに最も効果的です。 StructureMapはバージョン2.6.1からそれを行います。

私は、Web APIでのStructureMapを設定するには、どのように記事を書いた:Configuring StructureMap in ASP.NET WebAPI

また、マイク・ワッソンから記事をチェックすることができます。ここで予想よう Using the Web API Dependency Resolver

関連する問題