1

APIController を解決するために DryIOC.WebAPI を使用しています。

したがって、WebAPI 構成は次のとおりです。

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);
    }
}

IOCコンテナでマッピングを作成するのを忘れるまで、うまく機能しています。その場合、依存関係リゾルバーは、DryIOC を使用して APIController のインスタンスを作成できません。

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

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

どうすればこれを達成できますか?

4

2 に答える 2

1

可能なすべての情報を使用してコントローラーの解像度の問題を確認する別の方法は、IContainer.VerifyResolutionsメソッドを使用することです。

例えば:

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

詳細はウィキで。

注: 現在のDryIoc.WebApiは、コントローラーの実装を具体的なコントローラーの型とそのすべての実装型をサービス型として登録します。したがって、1 つの未解決のclass MyController: ApiController {}メソッドに対して、 VerifyResolutions3 つの同一のエラーが返されます。

  • 1つMyController
  • 1つApiController
  • そして1つはIHttpController

結果の検証errorsをグループ化Factory.FactoryIDして、出力をよりコンパクトにすることができます。

于 2016-03-24T16:33:12.363 に答える
1

マイクロソフトのドキュメントによると:

ASP.NET Web API 2 での依存関係の挿入

GetServiceメソッドが型を解決できない場合は、 null を返す必要があります。GetServicesメソッドが型を解決できない場合、空のコレクション オブジェクトを返す必要があります。

不明な型の例外をスローしないでください

このインターフェイスの実装は、基になる依存性注入コンテナーに委任して、要求された型の登録済みサービスを提供する必要があります。要求された型の登録済みサービスがない場合、ASP.NET MVC フレームワークは、このインターフェイスの実装がGetServiceからnullを返し、 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 がサービス タイプを解決できなかった場合でも、何が解決されなかったのかを把握し、それをキャッチして、推奨されるガイドラインに従ってデフォルト値を返します。両方の長所。

それが役立つことを願っています

于 2016-03-23T14:35:35.340 に答える