Должны ли EFCore и Dapper реализовывать одинаковые интерфейсы UOW / Repositories? - PullRequest
0 голосов
/ 22 апреля 2020

Я уже реализовал шаблоны UOW / Repository (ссылка this с небольшими изменениями для IDbContext), как указано ниже, для поддержки TDD:

  1. IDbContext
public interface IDbContext : IDisposable
{
    DbSet<T> Set<T>() where T: class;
    Task<int> SaveChangesAsync(CancellationToken cancellationToken = default);

    // Entities
    DbSet<Category> Categories{ get;set; }
    DbSet<Article> Articles {get;set;}
}
DblogDbContext реализованы IDbContext и DbContext из EFCore
public class BlogDbContext : DbContext , IDbContext
  {
      public BlogDbContext(DbContextOptions<BlogDbContext> options)
        :base(options)
      { }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
      {
          modelBuilder.ApplyConfiguration(new CategoryConfigurations());
          modelBuilder.ApplyConfiguration(new ArticleConfigurations());
      }

      public DbSet<Category> Categories { get; set; }
      public DbSet<Article> Articles {get;set;}
  }
IUnitOfWork
public interface IUnitOfWork : IDisposable
    {
        ICategoryRepository Categories{get;}
        Task<int> SaveAsync();
    }
UnitOfWork
public class UnitOfWork : IUnitOfWork
    {
        private readonly IDbContext _context;
        public UnitOfWork(IDbContext context)
        {
            _context = context;        
            Categories = new CategoryRepository(context);
        }
        public ICategoryRepository Categories { get; }
    }
    // removed code for implementation of Repositories

Я хотел бы добавить Dapper в мой проект с такими же интерфейсами UOW / Repositories для SQL запросов вручную или CRUD, если таковые имеются. Но я застрял в способе, который я в настоящее время внедряю для IDbContext , нет необходимости Set или DbSet для Dapper. Я имею в виду в DI .Netcore у меня в настоящее время есть:

services.AddDbContext<BlogDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase")));
            services.AddScoped<IDbContext, BlogDbContext>();
            services.AddScoped<IUnitOfWork, UnitOfWork>();

Я ожидаю иметь другую реализацию для IUnitOfWork, но использую Dapper в качестве ORM вместо EFCore. И я просто регистрирую это следующим образом:

services.AddScoped<IUnitOfWork, DapperUnitOfWork>();   

И все по-прежнему работает как обычно. Я не знаю, как в EFCore и Dapper сосуществуют на одних и тех же интерфейсах UOW / Repositories. Пожалуйста, дайте мне совет или решение, чтобы оба ORM работали под одним интерфейсом UOW / Repositories.

Что мне делать с таким требованием?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...