【问题标题】:Accessing the DBContext from classes in 2 different projects when one reads from DBContextBase and the other from DomainDBContext当一个从 DBContextBase 和另一个从 DomainDBContext 读取时,从 2 个不同项目中的类访问 DBContext
【发布时间】:2019-05-10 07:59:27
【问题描述】:

我有一个共享项目,我将我的共享和基础逻辑c 放入以在其他项目中重复使用,并在其上放置一个普通的 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-core entity-framework-core inversion-of-control


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 2017-01-12
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 2022-12-28
      相关资源
      最近更新 更多