Абстракция ef core 2 dbContext - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь сделать абстракцию над своим слоем контекста БД (EntityFramework 2.0).

Car.DataContext
 ------------------- 
 public abstract class BaseCarContext : DbContext
    {
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Car>(e =>
            {
                e.ToTable("Car");             
            });
            modelBuilder.Entity<Car>(e => { e.ToTable("Cars"); });
        }
    }

     public class CarContext : BaseCarContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (optionsBuilder.IsConfigured)
                return;

            optionsBuilder.UseSqlServer(@"Server = xxxx; Database = xxxx; Trusted_Connection = True;");
        }

        public DbSet<Car> Cars { get; set; }        
    }

 Car.Logic
 ----------------
 public interface ICarService
 {
    GetCarResponse RetrieveCar(int id);
    void Save(int id);
    ...
 }

 public class CarService : ICarService
 {
    private readonly ICarService service;   
    // dbContext interface

    public CarService(ICarService service){
        this.service = service; 
        // injecting db context interface
    }

    public void Save(int id){
        ... saving using injected db context
        // injected db context.Insert(new Car{ Name = "Honda" });
    }
    ...
 }

Как мне абстрагировать это ядро ​​ef 2 CarContext, чтобы использовать dbContext save

Я пытался создать интерфейс IDbContext, который реализуется CarContext но таким образом я не могу использовать dbContext.Cars.Insert, потому что я не реализую коллекцию автомобилей dbContext, у меня нет доступа к основным методам и свойствам ef.

Конечно, я могу использовать конкретную реализацию, но я пытаюсь создать абстракцию, чтобы я мог использовать модульные тесты, ...

Как бы вы это сделали?

1 Ответ

0 голосов
/ 04 мая 2018

Во-первых, вам не нужна абстракция для юнит-теста. EF Core на 100% подходит для тестирования. Во-вторых, единственными действительно приемлемыми абстракциями, на мой взгляд, для EF (или на самом деле any ORM) является либо микросервис, либо шаблоны поиска событий CQRS /. Они на самом деле добавляют ценность тем, что либо полностью абстрагируют зависимость и / или решают реальные проблемы бизнеса. Однако эти шаблоны также требуют значительных усилий для правильной реализации и, как таковые, обычно зарезервированы для больших и сложных приложений.

Долго и коротко, просто используйте EF напрямую, если у вас нет действительно веских причин не делать этого. Тестирование не является веской причиной.

...