2016-03-23 7 views
1

私はAPIControllersを解決するためにDryIOC.WebAPIを使用しています。DryIOC WebAPIフォールバックコントローラ

WebAPIのConfigがこれです:私はIOCコンテナにマッピングを作成することを忘れまで

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     // Configure Web API to use only bearer token authentication. 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 


     config.EnableCors(); 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     Startup.IocContainer.WithWebApi(config); 
     Startup.IocContainer.RegisterWebApiControllers(config); 
    } 
} 

ITSは、偉大な作業します。この場合、Dependencyリゾルバは、DryIOCを使用してAPIControllerのインスタンスを作成することができません。

これが発生すると、デフォルトのWebAPIリゾルバに戻り、「デフォルトのコンストラクタがありません」というエラーが表示されます。

これは私にとって望ましくない動作です。 DryIOCの解決に失敗した場合、私はそこで停止する必要があります。デフォルト実装へのフォールバックはなく、デフォルトコンストラクタについての不正確なメッセージもありません。私はDryIOCが解決できないタイプを知りたいので、修正することができます。

どうすればこの問題を解決できますか? Microsoftのドキュメントによると

+0

あなたはそれをDryIOCに渡してそこで停止する前にデフォルトリゾルバを自分で上書きすることができます – Nkosi

+0

私はここでDryIOCプルリクエストを作成しました:https://bitbucket.org/dadhi/dryioc/pull-requests/15/changed-the- resolutionId-throw/diff – reach4thelasers

+0

で、DryIOCフレームワークの変更はかなり厳しいものになっています。あなたは、Web APIが許す拡張性を利用するべきです。 DryIOCソースがデフォルトのリゾルバを置き換えるのではなく、どのようにラップするのかを見て、私は自分の答えを編集して、DryIOCResoverをラップして、あなたが望むエラーを投げる方法を示します。 – Nkosi

答えて

1

Dependency Injection in ASP.NET Web API 2

のgetService方法が型を解決できない場合、それは ヌルを返す必要があります。 GetServicesメソッドで型を解決できない場合は、 は空のコレクションオブジェクトを返します。

不明なタイプの例外をスローしないでください。

このインターフェイスの実装は、 要求されたタイプの登録済みサービスを提供するために、基礎となる 依存性注入コンテナに委任する必要があります。 要求された型の登録されたサービスが存在しない場合は、ASP.NET MVCフレームワークは 、このインタフェースの実装はのgetServiceからヌルを返すようにしてGetServicesから空 コレクションを返すように期待しています。

Web APIがコントローラインスタンスを作成するときは、最初に がコントローラタイプを渡してIDependencyResolver.GetServiceを呼び出します。 この拡張性フックを使用してコントローラを作成することができます。 はすべての依存関係を解決します。 GetServiceがnullを返す場合、Web APIはコントローラークラスのパラメーターのないコンストラクターとして を検索します。

あなたはデフォルトをオーバーライドすることができますが

public static class ResolverHelper { 
    public static void OverrideResolver(this HttpConfiguration httpConfiguration) { 
     var innerResolver = httpConfiguration.DependencyResolver; 
     var resolver = new MyDryIocDependencyResolver(innerResolver); 
     httpConfiguration.DependencyResolver = resolver; 
    } 
} 

自分をリゾルバとカスタムリゾルバにしたいどのように今までに失敗します。

スニペットがあなたの登録でMyDryIocDependencyResolver

public class MyDryIocDependencyResolver : IDependencyResolver { 
    IDependencyResolver innerResolver; 

    public MyCustomDependencyResolver(IDependencyResolver innerResolver) { 
     this.innerResolver = innerResolver; 
    } 

    public IDependencyScope BeginScope() { 
     return this; 
    } 

    public object GetService(Type serviceType) { 
     try { 
      return innerResolver.Getservice(serviceType); 
     } catch (Exception ex) { 
      //TODO: Log resolution error 
      return null; 
     } 
    } 

    public IEnumerable<object> GetServices(Type serviceType) { 
     try { 
      return innerResolver.GetServices(serviceType); 
     } catch (Exception ex) { 
      //TODO: Log resolution error 
      return new List<object>(); 
     } 
    } 

    public void Dispose() { 
     // NO-OP 
    } 
} 

からあなたがして上書きすることができ、それ

//...other code 
Startup.IocContainer.WithWebApi(config); 
Startup.IocContainer.RegisterWebApiControllers(config); 
config.OverrideResolver(); 
//...other code 

この方法であれば/ DryIocDependencyResolverは、あなたがまだ解決されなかったものを知っているサービスの種類を解決しなかった場合、これをキャッチし、推奨されるガイドラインに示されているデフォルト値を返します。両方の長所。可能なすべての情報をコントローラの解像度の問題をチェックするために

+1

これは確かにMS推薦です。しかし、IoCの統合ライブラリから詳細な例外が失われているという問題があります。 DryIocや他のIoCは、何が、なぜ解決されないのか、どのようなコンテナの状態について多くの情報を提供します。だから、問題をはるかに早く特定することができます。 – dadhi

1

別の方法を助け

希望は、IContainer.VerifyResolutionsメソッドを使用することです。例えば

wiki

var container = new Container().WithWebApi(config); 
var errors = container.VerifyResolutions(); 
Debug.Assert(errors.Length == 0); 

詳細。

注: コントローラとのみキャッチ、コンクリートコントローラタイプとサービスタイプとして、そのすべての実装タイプの電流DryIoc.WebApiレジスタコントローラの実装。だから、1つの未解決class MyController: ApiController {}方法VerifyResolutionsのために3つの同一のエラーが返されます:あなたは

  • MyController
  • ための1 ApiController
  • 用とIHttpController

のための1つをかもしれないグループ結果検証errorsFactory.FactoryIDによってよりコンパクトな出力を有する。

関連する問題