【问题标题】:How can I inject dependencies into an ELMAH custom ErrorLog?如何将依赖项注入 ELMAH 自定义错误日志?
【发布时间】:2012-10-16 15:15:11
【问题描述】:

我有一个使用 EF Code-First 上下文来存储错误的 ELMAH 自定义错误日志:-

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,这样ErrorLog 就不会实例化它自己的依赖项,但是我没有运气在文档中找到一个钩子。 ELMAH 似乎在内部实例化ErrorLog,所以我似乎唯一的选择是在我的自定义ErrorLog 中使用ServiceLocator,如果可能的话我想避免。

ELMAH 中是否有更好的钩子可供我用来注入?

【问题讨论】:

    标签: c# ninject elmah


    【解决方案1】:

    ELMAH 中的服务位置/依赖注入扩展点是 ServiceCenter.Current 属性,您可以在其中提供具有以下签名的委托:

    public delegate IServiceProvider ServiceProviderQueryHandler(object context);
    

    ELMAH 将使用ServiceCenter.Current 返回的System.IServiceProvider 来解析ErrorLog 实例。

    所以你需要做 3 件事来使用 Ninject(或任何 DI 容器)设置它

    1. 使用 Ninject 创建您自己的 System.IServiceProvider 实现,IKernel 接口已经派生自 System.IServiceProvider,所以它完成了。
    2. 您需要在容器中将EntityFrameworkElmahErrorLog 注册为ErrorLog 实现,因为ELMAH 将尝试解析ErrorLog 的实例。
    3. 将您的代表提供给ServiceCenter.Current

    因此,您的 RegisterServices 方法中需要类似以下内容:

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

    注意:在ServiceProviderQueryHandler 委托中,您将获得当前的HttpContext,您可以通过它微调您的权宜之计是如何解决的。

    您还应该注意,使用这种方法,您将无法在配置文件中配置 ErrorLog

    ELMAH 将始终使用您容器中已解析的实例,因为内置的 ServiceContainer 会读取您使用自定义逻辑覆盖的配置文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 2015-06-25
      • 2016-10-11
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多