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

时间:2017-10-23 20:29:10

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

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

  
    

无法从根提供程序解析作用域服务Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.IViewBufferScope

  

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

2 个答案:

答案 0 :(得分:8)

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

services.AddScoped<IEmailer, EmailerService>();

答案 1 :(得分:1)

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

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

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

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

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

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

  2. 禁用范围验证:

  3. 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();