Доступ к DBContext из классов в 2 разных проектах, когда один читает из DBContextBase, а другой из DomainDBContext - PullRequest
2 голосов
/ 10 мая 2019

У меня есть общий проект, в который я поместил свои общие и базовые логи c для повторного использования в других проектах и базовый проект 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, потому что он не зарегистрирован.Я думал об изменении регистрации на интерфейс, как показано ниже, но тогда, очевидно, у меня не будет доступа к DbSets моего домена в моих репозиториях.

services.AddDbContext<IDbContextBase,MyDomainDbContext>([options]);

Итак, вопрос в том, как мне установить это так, чтобыMyEventProcessor и UserRepository могут считывать и записывать в один и тот же контекст базы данных.

1 Ответ

3 голосов
/ 10 мая 2019

Вам необходимо зарегистрировать оба типа: DbContextBase и MyDomainDbContext, однако смысл состоит в том, чтобы повторно использовать один и тот же экземпляр для обоих случаев, чтобы добиться того, чтобы вы могли зарегистрировать их следующим образом:

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

Таким образом, вы сможете внедрить оба типа, и оба типа будут фактически одним и тем же экземпляром, который вы можете легко проверить, используя GetHashCode или аналогичный.

...