我们正在使用 Autofac 4 进行 DI,不久前我开始尝试使用 AI。现在我创建了一个 IdentityTelemetryInitializer 类,它需要 IIdentityProvider 能够获取当前授权用户的 ID 并将其添加到上下文中。我找不到将依赖项注入 TelemetryInitializer 的方法。如果我定义一个接受 IIdentityProvider 的构造函数,则完全跳过自定义初始化程序。欢迎任何想法。我正在考虑将用户 ID 也设置为线程主体,以便我们可以通过这种方式访问它,但我希望我可以为此使用 DI?
问问题
1737 次
2 回答
0
您不能使用构造函数作为使用默认(空)构造函数在内部初始化的初始化程序来注入依赖项。当您明确定义一个新的 ctor 时,您实际上已经“删除”了默认的 ctor,因此正如您所提到的,初始化程序被完全跳过。
因此,唯一的方法是在“初始化”方法期间解决依赖关系,在应用程序启动时注册它们之后。
ctx.RegisterType<MyService>().As<IService>().AsSelf(); // on application startup
ctx.Resolve<IService>(); // during initializer 'Initialize' method
于 2016-06-11T09:08:42.087 回答
0
您可能会看一下我在这里问的问题 How to have "Request" events with authenticated user id ?
因为我设法让 TelemetryInitializer 正常工作,按照@yonisha 的建议通过 HttpContext 传递用户 ID。
当然,它不像你试图达到的那样精益求精。
每次实例化 Telemetry 类时都会调用 Telemetry Initializer,因此实际上取决于您管理它们的方式。顺便说一句,我正在寻找好的建议/最佳实践:目前我在每个控制器上都有一个需要跟踪某些东西的私有实例,但由于控制器的生命周期,这闻起来并不好。
于 2018-03-28T13:16:06.613 回答