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

C# 无法从根提供程序解析作用域服务Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.IViewBufferScope,c#,asp.net-core,asp.net-core-2.0,C#,Asp.net Core,Asp.net Core 2.0,我试图在我的ASP.NET Core 2.0 web应用程序中使用此示例从视图创建html电子邮件正文。但是当我运行它并且我的控制器收到ajax请求时,我会得到以下错误: 无法从根提供程序解析作用域服务Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.IViewBufferScope 它可能来自于解决中的依赖项,但我不知道如何解决此问题。好的,问题是我使用了单例服务(EmailerService)的渲染器。我将其注册更改为Scoped,现在一切正常:

我试图在我的ASP.NET Core 2.0 web应用程序中使用此示例从视图创建html电子邮件正文。但是当我运行它并且我的控制器收到ajax请求时,我会得到以下错误:

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


它可能来自于解决中的依赖项,但我不知道如何解决此问题。

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

services.AddScoped<IEmailer, EmailerService>();
services.addScope();

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

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

在我的例子中,我有一个由Hangfire静态执行的计划任务:

var-mailer=ServiceProviderSinleton.Instance.GetService(typeof(IEmailer))
当您需要静态上下文中的作用域服务时,有两个选项:

  • 使用依赖项注入框架,使您能够更好地控制注入上下文。我强烈推荐NuGet的
    DryIoc.Microsoft.DependencyInjection
    。()

  • 禁用范围验证:

  • 返回WebHost.CreateDefaultBuilder()
    .ConfigureLogging(builder=>builder.AddSerilog(Log.Logger,dispose:true))
    .UseKestrel(选项=>options.ConfigureEndpoints(配置))
    .UseContentRoot(目录.GetCurrentDirectory())
    .Useii整合()
    .UseStartup()
    .useserlog()
    .UseDefaultServiceProvider(选项=>options.ValidateScopes=false)
    .Build();
    
    使用ASP.NET Core 2.1,您现在可以手动创建作用域:
    使用Microsoft.Extensions.DependencyInjection;使用(var scope=serviceProvider.CreateScope()){var myScopedService=scope.serviceProvider.GetService();}
    @MovGP0该代码到哪里去了?我该如何强制它工作?我需要你准备的一切吗?这是一个替代品吗?@RobertBurke,我想他指的是这样的设置:。我在遇到同样的问题后实现了它,它为我解决了这个问题。