【发布时间】:2019-12-06 09:55:06
【问题描述】:
通过接口注册/解析 DbContext 的正确方法是什么?
上下文:
我有多个 Web 服务,每个服务都有不同的 dbcontext。
由于我需要在共享项目中编写一些通用功能,我编写了一个由每个 dbcontext 实现的接口,因此我可以拥有一组共享功能“dbcontext-implementation-agnostic”,只需注入 dbcontext 接口。
在每个项目中,每个 dbcontext已经被其实现使用和注入,但我想在 common features 项目中只使用它的接口。
所以,在每个网络服务中,我都会有类似的内容:
services.AddDbContext<IMyDbcontext, MyDbcontext>(options =>
{
options.UseSqlServer(configuration.GetConnectionString("MyDbContext"));
});
services.AddTransient<ISharedService, SharedService>();
在共享项目中
public class SharedService : ISharedService
{
public SharedService(IMydbcontext context)
{
[...]
}
[...]
}
拥有IMyDbcontext就像
public interface IMyDbcontext
{
DbSet<SharedSettings> Settings { get; set; }
int SaveChanges(bool acceptAllChangesOnSuccess);
int SaveChanges();
Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default);
Task<int> SaveChangesAsync(CancellationToken cancellationToken = default);
}
我需要 Startup.cs 中的 ISharedService - Configure() with
app.ApplicationServices.GetService<ISharedService>();
我一直在谷歌上搜索并尝试了不同的方法,但我找不到一种有效的方法......
我尝试过使用转发器,如下所示:(建议here)
services.AddDbContext<MyDbContext>();
services.AddScoped<IMyDbContext>(provider => provider.GetRequiredService<MyDbContext>());
但是,虽然我在解决具体的 MyDbContext 时没有问题,但每当我尝试解决 IMyDbContext 时都会收到此错误
System.InvalidOperationException: '无法解决 来自根提供商的“Blah.IMyService”,因为它 需要范围服务 'Blah.IMydbcontext'。'
其中IMyService 注册为瞬态,它的实现构造函数是
public MyService(IMydbcontext context)
我也试过这样注册dbcontext
services.AddDbContext<IMyDbContext, MyDbContext>();
但是,当我尝试解决 MyDbContext 时,我得到了 null,我不明白为什么
【问题讨论】:
-
您能否展示一个更详细的当前启动示例以及相关类。目前尚不清楚您是否需要接口或实现。
-
你想做什么?如果您想同时解析
MyDbContext和IMyDbContext,则必须注册这两种类型。AddDbContext<IMyDbContext, MyDbContext>仅注册IMyDbContext与MyDbContext提供的实现。只需注册MyDbContext就足够了 - 任何需要MyDbContext的代码都会得到一个,并且永远不必知道数据来自哪里,例如数据库或字典。 -
我添加了更多上下文
标签: c# dependency-injection .net-core dbcontext ef-core-3.0