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"));