0

ASP.Net MVC4 プロジェクトでカスタム仮想プロバイダーを使用しています。プロバイダーを MyVirtualPathProvider と呼びましょう。プロバイダーは、次のように OnApplicationStarted メソッドに登録されます。

HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider());

メソッドは Global.asax.cs の一部です。その上に、次のものがあります。

public class MvcApplication : NinjectHttpApplication

ここで、[Inject] 属性を使用して、次のようにサービスの 1 つを挿入したいと思います。

    [Inject]
    public ILogger Logger { get; set; }

カスタム仮想パス プロバイダーで、注入された Logger を使用して何かをログに記録したい GetFile メソッドをオーバーライドしました。

     public override VirtualFile GetFile(string virtualPath)
     {
     ...
         Logger.Log(...);

残念ながら、Logger は null であるため、機能しません。

次のように、ロガーをカスタム仮想パスプロバイダーコンストラクターのパラメーターとして渡そうとしました。

HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider(Kernel.Get<ILogger>()));

残念ながら、「警告 CS0618: 'Ninject.Web.Common.NinjectHttpApplication.Kernel' は廃止されました: 'サービス ロケータとして Ninject を使用しないでください'」という警告があるため、これは進むべき道ではありません。

私は何を間違えましたか?お知らせ下さい。

4

1 に答える 1

0

ロギングを分野横断的な関心事と見なし、Ambient Context デザイン パターンを利用することをお勧めします。一般的に使用される型でコンストラクターを汚染したくない場合に役立ちます (DateTime プロバイダーが必要な場合と同じように)。このアプローチを採用した場合、パス プロバイダーに型を挿入する必要がないため、表示される警告を回避できます。

于 2014-09-26T16:17:26.087 に答える