ASP.NET Core-在Singleton注入上存储库依赖项注入失败 - c#

我正在使用SoapCore为我的ASP.NET Core MVC应用程序创建Web服务。

我正在使用Entity Framework Core和简单的存储库模式来获取我的数据库数据。

我通过Startup.cs中的.AddSingleton()注入存储库类:

services.AddSingleton<IImportRepository, ImportRepository>();
services.AddSingleton<IWebService, WebService>();

由于EF DbContext的作用域是范围,因此在调用Web服务时出现错误:

无法使用来自以下对象的作用域服务'App.Data.ApplicationDbContext'
单例“ App._Repository.IImportRepository”。

当我改用.AddScoped()时,它可以正常工作。

我读过通过controllers / classes构造函数注入作用域依赖项是不好的做法,因为它“回退”为单例或行为类似。

我想知道是否有另一种方法可以使它与单例一起使用,或者通过ctor在我的控制器中使用作用域注入时,从长远来看是否会有一些重大缺点(大约100-200个用户将使用该站点)?

参考方案

简而言之,您的终生应该受到“限制”。仅在有充分理由的情况下才应使用单例或瞬态寿命。对于单例来说,诸如管理锁或保存数据之类的东西需要在应用程序的整个生命周期中保持不变,而这两者都不适合存储库的概念。储存库应该完全是一次性的。关键是要保留到数据库或其他存储中,因此它们不应自行包含任何需要保留的数据。

总之,最好的选择是使存储库具有作用域,以便您可以直接插入上下文。就构造函数注入而言,我不确定这是一个不好的做法。实际上,在大多数情况下这就是依赖注入的工作原理,因此,没有其他就不能真正拥有一个。

如果您绝对需要单身人士,那么唯一的选择就是服务定位器反模式。为此,您将注入IServiceProvider

public class MyRepo
{
    private readonly IServiceProvider _serviceProvider;

    public MyRepo(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    ...
}

然后,每次您需要上下文(这很重要)时,您都需要做:

using (var scope = _serviceProvider.CreateScope())
{
    var context = scope.ServiceProvider.GetRequiredService<MyContext>();
    // do something with context
}

如何在ASP.NET Core Web应用程序中增加JSON反序列化MaxDepth限制 - c#

我们正在将ASP.NET Core 2.1与.NET Framework 4.6.2结合使用。我们有一个客户需要向我们的Web应用程序发送一个很大程度上嵌套的json结构。当他们进行此调用时,我们将输出以下日志并返回错误: 读取器的MaxDepth超过了32。路径“ super.long.path.to property”,第1行,位置42111。”我浏览了…

在ASP.NET Core 2.1中添加自定义TagHelpers - c#

我严格按照ASP.NET Core文档进行操作,并花费了大量时间来拖曳堆栈溢出,试图实现简单的自定义TagHelper,但没有成功。任何人都可以就任何陷阱或已知错误提出建议吗?应用程序属性:AssemblyName: AmpWeb Target Framework .NET Core 2.1 NuGet软件包Microsoft.AspNetCore.All …

ASP.NET Core 2.0中的多个身份 - c#

我正在将ASP.NET Core 1.0应用程序迁移到ASP.NET Core 2.0。在我的启动中,我正在配置两个身份:services.AddIdentity<IdentityUser, IdentityRole>(configureIdentity) .AddDefaultTokenProviders() .AddUserStore<…

如何基于框架执行不同的动作? (ASP.NET 5) - c#

假设您必须将C#应用程序从.NET框架迁移到新的.NET Core,因为您希望拥有其中的一些新功能。您拥有自己的代码库,并且希望一次获得完整的工作部件,因为一次迁移所有的工作量很大。主要思想是成为未来的完全核心。我的问题是:有没有一种方法可以检查一个框架中存在但另一个框架中没有的功能?还是根据框架执行不同的动作? 参考方案 有编译器指令(#if)来检查与两个…

从Axios请求以ASP.NET Core API返回下载文件 - c#

大家好我正在尝试从Axios Request从ASP.NET Core Web API下载文件。这是我的示例API方法。 (基于此stackoverflow question的代码)[HttpPost("download")] public async Task<IActionResult> DownloadFile(){ .…