通过ASP.NET Core中的UseApplicationInsights / AddApplicationInsights轻松使用注入器

时间:2018-07-06 01:33:32

标签: c# asp.net-core dependency-injection simple-injector

我正在构建一个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已注册为“异步范围”   生活方式,但实例是在   活动(异步作用域)作用域。'

谢谢

1 个答案:

答案 0 :(得分:1)

此问题是由简单注入器的ASP.NET Core集成包4.3.0版本中的a bug引起的。

由于该错误,即使在依赖范围为{{1}的情况下,任何 auto 交叉连接的依赖项都只能在有效Scope范围内解决。 }。 SingletonTelemetryConfiguration

当明确交叉连接该依赖项时(即使用Singleton),该问题就会消失,因为container.CrossWire<TelemetryConfiguration>(app)确实允许CrossWire在活动范围之外得以解决。

该问题已在集成软件包的patch release 4.3.1中解决。在此版本中,您可以在活动的Web请求或简单注入器Singletons的上下文之外解析TelemetryConfiguration

但是,如果交叉服务是ScopeTransient,则仍然需要有一个活动的Web请求,或者(如果是在后台线程上运行的话)一个活动的Simple。喷射器Scoped