【问题标题】:Cannot resolve scoped service Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.IViewBufferScope from root provider无法从根提供程序解析范围服务 Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.IViewBufferScope
【发布时间】:2018-04-04 12:13:39
【问题描述】:

我正在尝试在我的 ASP.NET Core 2.0 Web 应用程序中使用此示例 RazorViewEngineEmailTemplates 从 View 创建一个 html 电子邮件正文。但是当我运行它并且我的控制器收到一个 ajax 请求时,我收到了这个错误:

无法从根提供程序解析范围服务 Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.IViewBufferScope

这可能来自解决 RazorViewToStringRenderer class 中的依赖关系,但我不知道如何解决这个问题。

【问题讨论】:

    标签: c# asp.net-core asp.net-core-2.0


    【解决方案1】:

    好的,问题是我使用了 Singleton 服务 (EmailerService) 的渲染器。我将其注册更改为 Scoped,现在一切正常:

    services.AddScoped<IEmailer, EmailerService>();
    

    【讨论】:

      【解决方案2】:

      当服务作为作用域注入时,依赖类也必须作为作用域注入。

      不幸的是,这并不适用于所有用例。静态创建电子邮件服务时,您没有 HTTP 上下文。

      就我而言,我有一个由 Hangfire 静态执行的计划任务:

      var mailer = ServiceProviderSinleton.Instance.GetService(typeof(IEmailer))
      

      当您需要静态上下文中的范围服务时,您有两种选择:

      1. 使用可以让您更好地控制注入上下文的依赖注入框架。我强烈推荐 NuGet 的DryIoc.Microsoft.DependencyInjection。 (Documentation)

      2. 禁用范围验证:

      return WebHost.CreateDefaultBuilder()
          .ConfigureLogging(builder => builder.AddSerilog(Log.Logger, dispose: true))
          .UseKestrel(options => options.ConfigureEndpoints(configuration))
          .UseContentRoot(Directory.GetCurrentDirectory())
          .UseIISIntegration()
          .UseStartup<TStartup>()
          .UseSerilog()
          .UseDefaultServiceProvider(options => options.ValidateScopes = false)
          .Build();
      

      【讨论】:

      • 借助 ASP.NET Core 2.1,您现在可以手动创建范围:using Microsoft.Extensions.DependencyInjection; using(var scope = serviceProvider.CreateScope()) { var myScopedService = scope.ServiceProvider.GetService&lt;MyScopedService&gt;(); }
      • @MovGP0 该代码甚至去了哪里,我该如何强制它工作?我需要你设置的所有东西吗?它是其他东西的替代品吗?
      • @RobertBurke,我认为他指的是这样的设置:stackoverflow.com/a/55381457/522859。在遇到同样的问题后,我实现了它并为我解决了它。
      猜你喜欢
      • 1970-01-01
      • 2020-09-06
      • 2020-08-01
      • 2020-05-11
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 2020-05-22
      • 2022-10-18
      相关资源
      最近更新 更多