我正在嘗試對我的數據庫上下文層(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
保存
我試圖製作一個由CarContext
實現的接口IDbContext
,但是那樣我就不能使用dbContext.Cars.Insert
因為我沒有實現dbContext汽車集合,因此無法訪問ef核心方法和屬性。
我當然可以使用具體的實現,但是我正在嘗試進行抽象,以便可以使用單元測試,...
你會怎麼做?
首先,您不需要抽象即可進行單元測試。 EF Core是100%測試友好的。其次,在我看來,對於EF(或實際上是任何 ORM),唯一真正可接受的抽像是微服務或CQRS /事件源模式。那些產品實際上增加了價值,因為它們要么完全抽象了依賴關係和/或解決了實際的業務問題。但是,這些模式也需要大量的精力才能正確實現,因此,通常保留給大型,複雜的應用程序使用。
總之,除非您有充分的理由不這樣做,否則直接使用EF。測試不是一個很好的理由。