我正在构建一个ASP.NET Core 2.1应用程序。对于应用程序洞察遥测,我有我的自定义类,但我也想使用内置的ITelemetryInitializer
。启用自动交叉布线后,Simple Injector是否可以自动解决这些依赖性?
更新
我尝试了下面的代码,并得到如下所示的错误。我不确定自动交叉布线还应该如何工作。
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddSingleton<IControllerActivator>(
new SimpleInjectorControllerActivator(container));
services.EnableSimpleInjectorCrossWiring(container);
services.UseSimpleInjectorAspNetRequestScoping(container);
container.AutoCrossWireAspNetComponents(app);
services.AddApplicationInsightsTelemetry(
applicationInsightsLoggerConfig.InstrumentationKey);
var test = Container.GetInstance<TelemetryConfiguration>();
类型TelemetryConfiguration的注册代表抛出了一个
例外。 IServiceScope类型的注册委托抛出了一个
例外。 IServiceScope已注册为“异步范围”
生活方式,但实例是在
有效(异步作用域)作用域。”
谢谢
最佳答案
此问题是由用于简单注入器的ASP.NET Core集成包4.3.0版本中的a bug引起的。
由于该错误,即使依赖项为Singleton
,也只能在活动的Scope上下文中解决任何自动交叉依赖项。 TelemetryConfiguration
是Singleton
。
当明确交叉连接该依赖项时(即使用container.CrossWire<TelemetryConfiguration>(app)
),该问题就会消失,因为CrossWire
确实允许在活动范围之外解决Singletons
。
该问题已在集成软件包的patch release 4.3.1中解决。在此版本中,您可以在活动的Web请求或简单注入器TelemetryConfiguration
的上下文之外解析Scope
。
但是,如果交叉连接服务是Transient
或Scoped
,则仍然需要有一个活动的Web请求,或者,如果是在后台线程上运行,则需要一个活动的Simple Injector Scope
。