Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过在存储库中注入IServiceProvider来实现工作单元模式?_C#_Asp.net Core_Repository Pattern_Unit Of Work - Fatal编程技术网

C# 如何通过在存储库中注入IServiceProvider来实现工作单元模式?

C# 如何通过在存储库中注入IServiceProvider来实现工作单元模式?,c#,asp.net-core,repository-pattern,unit-of-work,C#,Asp.net Core,Repository Pattern,Unit Of Work,我必须在我的项目中实现工作单元模式,但我找不到使用内存数据库的正确方法。我有两个存储库: public class RepositoryA : IRepositoryA { private readonly IServiceScope _scope; private readonly ApiContext _apiContext; public RepositoryA(IServiceProvider services) { _scope = s

我必须在我的项目中实现工作单元模式,但我找不到使用内存数据库的正确方法。我有两个存储库:

public class RepositoryA : IRepositoryA
{
    private readonly IServiceScope _scope;
    private readonly ApiContext _apiContext;

    public RepositoryA(IServiceProvider services)
    {
        _scope = services.CreateScope();
        _apiContext = _scope.ServiceProvider.GetRequiredService<ApiContext>();
    }

    //some methods
}

public class RepositoryB : IRepositoryB
{
    private readonly IServiceScope _scope;
    private readonly ApiContext _apiContext;

    public RepositoryB(IServiceProvider services)
    {
        _scope = services.CreateScope();
        _apiContext = _scope.ServiceProvider.GetRequiredService<ApiContext>();
    }

    //some methods
}
在my Startup.cs中,我的ConfigureServices方法中包含以下内容:

services.AddSingleton<IUnitOfWork, UnitOfWork>();
services.AddSingleton<IRepositoryA, RepositoryA>();
services.AddSingleton<IRepositoryB, RepositoryB>();
services.AddDbContext<ApiContext>(options => options.UseInMemoryDatabase("Database"));
我有一个错误:

InvalidOperationException:无法使用singleton Project.Repositories.Interface.IRepositoryA中的作用域服务Project.Data.ApiContext


此错误是由于内存中的数据库导致的。所以我需要在存储库的构造函数中注入IServiceProvider并创建作用域,这在没有工作单元的情况下是可行的。但现在我需要一个工作单元,我不知道如何实现它。有什么方法可以以不同的方式实现工作单元,或者更改我的存储库吗?

如错误所示,您不应该将作用域生命周期依赖项注入到单例中。DBContext通常注册为作用域

如果存储库依赖于上下文,那么它们也应该被限定范围

比如说

services.AddScope<IUnitOfWork, UnitOfWork>(); 
services.AddScope<IRepositoryA, RepositoryA>(); 
services.AddScope<IRepositoryB, RepositoryB>();
services.AddDbContext<ApiContext>(options => options.UseInMemoryDatabase("Database"));
services.AddScope();
services.AddScope();
services.AddScope();
services.AddDbContext(options=>options.UseInMemoryDatabase(“数据库”);

它不起作用
是一个相当宽泛的说法。正如目前所写的,很难准确地说出你在问什么。如果你能重新设置问题的格式,让我们更清楚地了解当前的问题以及你实际想做的事情,那就太棒了。通常,必须注入服务提供商被视为一种代码气味。(维修定位器反模式)。为什么存储库是单例的?@Nkosi谢谢你的回答,我会尝试编辑一下我的问题。。。我不知道是否有必要将存储库设置为单例。我只是在线学习了一些示例,并像其他示例一样实现。正如错误所示,您不应该将作用域的生存期依赖项注入到单例中。DBContext通常注册为作用域。如果存储库依赖于上下文,那么它们也应该被限定范围。@就是这样,那就是错误!你能像services.AddScope()这样做一些评论吗;services.AddScope();services.AddScope();所以我可以标记为已回答?
public RepositoryA(ApiContext apiContext)
{
    _apiContext = apiContext;
}
services.AddScope<IUnitOfWork, UnitOfWork>(); 
services.AddScope<IRepositoryA, RepositoryA>(); 
services.AddScope<IRepositoryB, RepositoryB>();
services.AddDbContext<ApiContext>(options => options.UseInMemoryDatabase("Database"));