如何在自定义TelemetryInitializer中注入依赖项?

时间:2016-06-10 14:38:16

标签: autofac azure-application-insights telemetry

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

当然,它并不像你想要的那样精益求精。

每次实施遥测类时都会调用遥测初始化程序,因此实际上取决于您如何管理它们。顺便说一下,我正在寻找好的建议/最佳实践:目前我在每个控制器上都有一个需要跟踪某些内容的私有实例,但由于Controller的生命周期而闻起来并不好。