J'essaie de faire une abstraction sur ma couche de contexte DB (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" });
}
...
}
Comment puis-je CarContext
cet CarContext
core 2 CarContext
afin d'utiliser dbContext
save
J'ai essayé de créer une interface IDbContext
qui est implémentée par CarContext
mais de cette façon, je ne peux pas utiliser dbContext.Cars.Insert
parce que je n'implémente pas la collection de voitures dbContext, je n'ai pas accès aux méthodes et propriétés principales d'ef.
Je peux bien sûr utiliser une implémentation concrète mais j'essaie de faire une abstraction pour pouvoir utiliser des tests unitaires, ...
Comment ferais-tu ceci?
Tout d'abord, vous n'avez pas besoin d'une abstraction pour effectuer un test unitaire. EF Core est 100% compatible avec les tests. Deuxièmement, les seules abstractions vraiment acceptables, à mon avis pour EF (ou vraiment n'importe quel ORM), sont soit un microservice, soit le CQRS / les modèles de sourcing d'événements. Ceux-ci ajoutent en fait de la valeur dans la mesure où ils résument complètement la dépendance et / ou résolvent de vrais problèmes liés au secteur d'activité. Cependant, ces modèles nécessitent également un effort important pour être correctement implémentés et, en tant que tels, sont généralement réservés aux applications complexes et de grande taille.
Long et court, utilisez directement EF, sauf si vous avez une bonne raison de ne pas le faire. Les tests ne sont pas une bonne raison.