我有一个共享项目,可以将共享逻辑和基本逻辑放入其他项目中复用,并在其之上有一个Normal 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# - 当一个从DBContextBase读取而另一个从DomainDBContext读取时,从2个不同项目中的类访问DBContext,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56073163/