10

私は依存性注入に慣れていませんが、必要な場所に満足していますNinjectNinject.Extensions.Logging[Inject]ILogger

ただし、一部のDelegatingHandlersはすべての楽しみを台無しにしています。

public class HttpsHandler : DelegatingHandler
{
    [Inject]
    public ILogger Logger { get; set; }

    protected override Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
            if (!string.Equals(request.RequestUri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
            {
                Logger.Info(String.Format("{0}: is using HTTP", request.RemoteAddress());
                return
                    Task.Factory.StartNew(
                        () =>
                        new HttpResponseMessage(HttpStatusCode.BadRequest)
                        {
                            Content = new StringContent("HTTPS Required")
                        });
            }

            return base.SendAsync(request, cancellationToken);
        }
 }

Ninject.Extensions.Logger.Nlog2 を delegatinghandler 内の Ilogger に注入する方法について、誰かが私を正しい方向に向けることができますか?

アップデート

ピートはコメントで私を正しい方向に導いてくれたと思います (ありがとう!)。に次のコンストラクターを追加しましたHttpsHandler

public HttpsHandler()
        {
            var kernel = new StandardKernel();

            var logfactory = kernel.Get<ILoggerFactory>();
            this.Logger = logfactory.GetCurrentClassLogger();
        }

そして今、ロガーが機能しています!

私の唯一の質問が残っています。これは正しい方法ですか、それともアンチパターンですか?

4

4 に答える 4

21

DelegatingHandlersアプリケーションの開始時に、Web API で 1 回だけ初期化されます。

これは Web API の既知の問題/設計機能です (パフォーマンス上の理由から推測します) - http://aspnetwebstack.codeplex.com/workitem/62のバグ レポートを参照してください。

あなたが自分で提案したようなコンストラクターの初期化を使用すると、シングルトン型の依存関係がある場合にのみ機能します(そのため、ロガーが機能します)。いずれにせよ、解決を Web API に委譲する場合DependencyResolverは、回避策として を使用する必要がありますGetDependencyScope()。これは、 から呼び出すことができますHttpRequestMessage

少し前に、Ni​​nject でそれを行うためのウォークスルーを投稿しました。現在のソリューションでは、Ninject とハンドラーが結合されているため、このアプローチを使用して deendency を解決する必要があります。これは望ましくありません。

于 2013-02-07T22:32:59.117 に答える
1

必要なのはこれだと思います。

これは、MVC の Ninject 依存関係リゾルバーです。次に、使用する必要があると思います:

GlobalConfiguration.Configuration.ServiceResolver.SetResolver()

そして、NInject 依存関係リゾルバーを渡します。

于 2013-02-07T17:25:15.203 に答える