我正在构建一个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已注册为“异步范围” 生活方式,但实例是在 活动(异步作用域)作用域。'
谢谢
答案 0 :(得分:1)
此问题是由简单注入器的ASP.NET Core集成包4.3.0版本中的a bug引起的。
由于该错误,即使在依赖范围为{{1}的情况下,任何 auto 交叉连接的依赖项都只能在有效Scope范围内解决。 }。 Singleton
是TelemetryConfiguration
。
当明确交叉连接该依赖项时(即使用Singleton
),该问题就会消失,因为container.CrossWire<TelemetryConfiguration>(app)
确实允许CrossWire
在活动范围之外得以解决。
该问题已在集成软件包的patch release 4.3.1中解决。在此版本中,您可以在活动的Web请求或简单注入器Singletons
的上下文之外解析TelemetryConfiguration
。
但是,如果交叉服务是Scope
或Transient
,则仍然需要有一个活动的Web请求,或者(如果是在后台线程上运行的话)一个活动的Simple。喷射器Scoped
。