5

エラーを保存するためにEF Code-Firstコンテキストを使用するELMAHカスタムErrorLogがあります:-

class EntityFrameworkElmahErrorLog
{
    public EntityFrameworkElmahErrorLog(IDictionary config) : this() { }

    public override ErrorLogEntry GetError(string id)
    {
        using (var context = new MyContext())
        {
            var intId = Int64.Parse(id, CultureInfo.InvariantCulture);
            var item = context.ErrorLog.Single(x => x.Id == intId);
            return new ErrorLogEntry(this, id, ErrorXml.DecodeString(item.Details));
        }
    }

    // etc.

}

ErrorLog は web.config で接続されています:-

<errorLog type="MyProject.EntityFrameworkErrorLog, MyProject" />

私はすでにプロジェクトの他の場所で Ninject を使用しています。が独自の依存関係をインスタンス化しないMyContextように注入したいのですが、ドキュメントでフックを見つけることができません。ErrorLogELMAH はErrorLog内部でインスタンス化しているように見えるので、私が持っていると思われる唯一のオプションは、可能であれば避けたいServiceLocatorカスタム内で使用することです。ErrorLog

注入に使用できるELMAHで利用可能なより良いフックはありますか?

4

1 に答える 1

13

ELMAH のサービス ロケーション/依存性注入拡張ポイントはServiceCenter.Current、デリゲートに次の署名を提供できるプロパティです。

public delegate IServiceProvider ServiceProviderQueryHandler(object context);

ELMAH は、System.IServiceProviderによって返されたを使用してインスタンスServiceCenter.Currentを解決しErrorLogます。

したがって、Ninject (または任意の DI コンテナー) でセットアップするには、3 つのことを行う必要があります。

  1. インターフェイスがすでに from から派生しているSystem.IServiceProviderNinject を使用して独自の実装を作成します。これで完了です。IKernelSystem.IServiceProvider
  2. ELMAH は のインスタンスを解決しようとするため、EntityFrameworkElmahErrorLogコンテナに を実装として登録する必要があります。ErrorLogErrorLog
  3. あなたの代理人を提供するServiceCenter.Current

RegisterServicesしたがって、メソッドには次のようなものが必要です。

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<ErrorLog>().To<EntityFrameworkElmahErrorLog>();
    ServiceCenter.Current = (httpContext) => kernel;
}  

注:ServiceProviderQueryHandlerデリゲートでは、現在の情報を取得し、HttpContextそれを使用して、便宜をどのように解決するかを微調整できます。

また、このアプローチでは、構成ファイルで構成する機能が失われることに注意してください。ErrorLog

ELMAH は常にコンテナーから解決されたインスタンスを使用します。これは、ビルトインがServiceContainerカスタム ロジックでオーバーライドする構成ファイルを読み取るためです。

于 2012-10-19T11:18:59.877 に答える