c# - 当一个从 DBContextBase 和另一个从 DomainDBContext 读取时,从 2 个不同项目中的类访问 DBContext
问题描述
我有一个共享项目,我将共享和基本逻辑放入以在其他项目中重用,并在其上放置一个普通的 asp.net 核心项目。
在共享基础项目中,我有:
class DbContextBase : DbContext
{
public DbSet<ActivityLog> ActivityLogs { get; set; }
public DbSet<Event> Events { get; set; }
SaveChanges(...)
}
class MyEventProcessor
{
private readonly DbContextBase _databaseContext;
public MyEventProcessor(DbContextBase databaseContext)
{
_databaseContext=databaseContext;
}
public void AddEvent(Event e){}
public void ProcessEvent(Event e){}
}
在 .net 核心 webApi 一中,我有我的域特定逻辑
class MyDomainDbContext : DbContextBase
{
public DbSet<User> Users{ get; set; }
}
class UserRepository
{
private readonly MyDomainDbContext _databaseContext;
public UserRepository(MyDomainDbContext databaseContext){_databaseContext=databaseContext;}
}
public class Startup
{
public Startup(IConfiguration configuration)
{
services.AddDbContext<MyDomainDbContext>([options]);
services.AddScoped<UserRepository>();
services.AddScoped<EventProcessor>();
}
}
问题是,这样它在启动时失败,因为它没有注册,所以无法找到 DbContextBase。我想过将注册更改为如下所示的界面,但显然我将无法访问我的存储库中我的域的 DbSet。
services.AddDbContext<IDbContextBase,MyDomainDbContext>([options]);
所以问题是,我如何设置它以便 MyEventProcessor 和 UserRepository 可以读取和写入相同的数据库上下文。
解决方案
您需要注册这两种类型:DbContextBase
和MyDomainDbContext
,但是重点是为这两种情况重用相同的实例,以实现您可以通过以下方式注册它们:
services.AddDbContext<MyDomainDbContext>([options]);
services.AddScoped<DbContextBase, MyDomainDbContext>(sp => sp.GetRequiredService<MyDomainDbContext>());
这样,您将能够注入两种类型,并且两种类型实际上都是同一个实例,您可以轻松地检查使用GetHashCode
或类似的实例。
推荐阅读
- c# - 使用 TVP 的批量更新适用于 SSMS,但不适用于 C#
- c++ - 在多个 cpp 文件中包含带有定义的 h 文件
- java - getBundle() 时出现 java.util.MissingResourceException
- swift - 为什么 DatePicker 在 Date 变为 nil 时会崩溃?
- c++ - C++ 未初始化的结构成员 - 字段不存在
- c# - 是否可以使用标记将任何对象作为参数传递给 LinkButton.CommandArgument?
- java - 是否可以使用 Java 8 API 更改所有 Guava API?
- php - Magento 2 选择特定的集合字段不起作用
- r - 如何在 R 中根据帐户和时间间隔(例如最后一天、上周、上个月等)创建新功能?
- devexpress - 网格控制 - 两列合二为一,取决于值