gpt4 book ai didi

c# - 如何将依赖项注入(inject) ELMAH 自定义错误日志?

转载 作者:太空狗 更新时间:2023-10-29 22:16:36 28 4
gpt4 key购买 nike

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

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

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

最佳答案

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

public delegate IServiceProvider ServiceProviderQueryHandler(object context);

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

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

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

因此,您需要在 RegisterServices 方法中使用如下内容:

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

注意:在 ServiceProviderQueryHandler 委托(delegate)中,您可以获得当前的 HttpContext 并且您可以微调如何解决您的权宜之计。

您还应该注意,使用这种方法您将失去在配置文件中配置ErrorLog 的能力。

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

关于c# - 如何将依赖项注入(inject) ELMAH 自定义错误日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12917919/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com