我有一个共享项目,可以将共享逻辑和基本逻辑放入其他项目中复用,并在其之上有一个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可以读写同一数据库上下文。

最佳答案

您需要注册两种类型:DbContextBaseMyDomainDbContext,但是重点是要在两种情况下重用相同的实例,以实现可以通过以下方式注册它们:

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/

10-12 12:43
查看更多