首页 > 解决方案 > 当一个从 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 可以读取和写入相同的数据库上下文。

标签: c#asp.net-coreentity-framework-coreinversion-of-control

解决方案


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

services.AddDbContext<MyDomainDbContext>([options]);
services.AddScoped<DbContextBase, MyDomainDbContext>(sp => sp.GetRequiredService<MyDomainDbContext>());

这样,您将能够注入两种类型,并且两种类型实际上都是同一个实例,您可以轻松地检查使用GetHashCode或类似的实例。


推荐阅读