【问题标题】:How inject dependency in custom TelemetryInitializer?如何在自定义 TelemetryInitializer 中注入依赖项?
【发布时间】:2016-10-11 13:59:10
【问题描述】:

我们正在使用 Autofac 4 进行 DI,不久前我开始尝试使用 AI。现在我创建了一个 IdentityTelemetryInitializer 类,它需要 IIdentityProvider 能够获取当前授权用户的 ID 并将其添加到上下文中。我找不到将依赖项注入 TelemetryInitializer 的方法。如果我定义一个接受 IIdentityProvider 的构造函数,则完全跳过自定义初始化程序。 欢迎任何想法。我正在考虑将用户 ID 也设置为线程主体,以便我们可以通过这种方式访问​​它,但我希望我可以为此使用 DI?

【问题讨论】:

  • “完全跳过自定义初始化程序”是什么意思?你的意思是基础ctor没有被调用?

标签: autofac azure-application-insights telemetry


【解决方案1】:

您不能使用构造函数作为使用默认(空)构造函数在内部初始化的初始化程序来注入依赖项。当您明确定义一个新的 ctor 时,您实际上已经“删除”了默认的 ctor,因此正如您所提到的,初始化程序被完全跳过了。

因此,唯一的方法是在应用程序启动时注册它们之后,在“初始化”方法期间解决依赖关系。

ctx.RegisterType<MyService>().As<IService>().AsSelf(); // on application startup
ctx.Resolve<IService>(); // during initializer 'Initialize' method

【讨论】:

  • 感谢您的回答。我试过了,但是,依赖项是通过 .InstancePerRequest() 在 Autofac 中注册的。遥测初始化器类似乎存在于不同的(更长的生命周期)范围内,并且无法访问每个请求的依赖项:-(
  • @ParaJaco 你不能使用 HttpContext 来解决依赖关系吗?来自 Autofac 文档 - How do I work with per-request lifetime scope?:“如果您在尝试使用 DependencyResolver.Current 的 ASP.NET MVC 应用程序中有应用程序启动代码或后台线程 - AutofacDependencyResolver 需要 Web 上下文来解决问题。当您尝试从解析器,它将尝试启动每个请求的生命周期范围并将其与当前的 HttpContext 一起存储"
  • 我不知道该怎么做,你能举例说明如何做到这一点吗?
  • @yonisha(和其他人):即使这有效,它也以某种方式打破了 DI 的承诺,还是我在某个地方错了?这里有什么问题?这是不够好的 TelemetryInitializer API 吗?我猜这个用例很常见,但现在我没有看到解决它的实用解决方案
【解决方案2】:

你可以看看我在这里问的问题 How to have "Request" events with authenticated user id ?

因为我设法让 TelemetryInitializer 正常工作,并按照 @yonisha 的建议通过 HttpContext 传递用户 ID。

当然,它并不像您试图实现的那样精益求精。

每次实例化 Telemetry 类时都会调用 Telemetry Initializer,因此实际上取决于您管理它们的方式。顺便说一句,我正在寻找好的建议/最佳实践:目前我在每个控制器上都有一个私有实例,需要跟踪某些东西,但由于控制器的生命周期,这闻起来并不好。

【讨论】:

  • 确实退了一步,我的回答不是问题的答案,而是解决问题的方法。
猜你喜欢
  • 1970-01-01
  • 2010-11-05
  • 2015-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
相关资源
最近更新 更多