首页 > 解决方案 > 在拥有具有不同模型的多个数据库源时,我应该在 DAL 中使用什么设计模式?

问题描述

我有一个已经存在的 SQL 数据库,其中有表 Car 例如看起来像这样

public class Car
{
    public string Brand { get; set; }
    public string AvailableColorsCommaSperated { get; set; }
}

现在我正在迁移到 MongoDb,以便数据看起来像这样

public class Car
{
    public string Brand { get; set; }
    public List<string> Colors { get; set; }
}

但我必须同时维护 SQL 数据库,因为即使在迁移后它仍将保持使用一段时间。

现在在我的 DAL 层中,我有一个主接口和类,看起来像 Repository 模式,接口就是这样

public interface ICarDAL
{
    List<Car> GetAllCars();
}

public class CarDAL : ICarDAL
{
    private readonly ICarSQL carSQL;
    public CarDAL(ICarSQL carSQL)
    {
        this.carSQL = carSQL;
    }
    public List<Car> GetAllCars()
    {
        return carSQL.GetAllCars();
    }
}

虽然使用 SQLContext 实现,但存在另一个具有实现的接口和类

public interface ICarSQL : ICarDAL
{
    new List<Car> GetAllCars();
}

public class CarSQL : ICarSQL
{
    private readonly DbContext dbContext; 
    public CarSQL(DbContext dbContext)
    {
        this.dbContext = dbContext;
    }

    public List<Car> GetAllCars()
    {
        // Get Cars..
    }
}

我可以为 Mongo 添加一个单独的层以从 ICarDAL 继承并自行实现这些功能,但问题是我将为它们中的每一个都有不同的汽车模型(汽车只是一个例子)

如何抽象 DAL 层,以便可以使用不同的模型对不同的数据库进行 CRUD 操作?我是否需要不同的上下文或在工厂中使用相同的上下文来区分不同的数据库类?

标签: c#sql.net-coredesign-patternsentity-framework-core

解决方案


你可以让你的界面更通用

 public interface IGenericRepository<T> where T : class
    {
        IEnumerable<T> GetAll();
        T GetById(object id);
        void Insert(T obj);
        void Update(T obj);
        void Delete(object id);
        void Save();
    }

所以每个 dal 层都会实现它自己的版本,你甚至可以为 ID 使用不同的类型,例如:

 public interface IGenericRepository<T,K> where T : class
    {
        IEnumerable<T> GetAll();
        T GetById(K id);
        void Insert(T obj);
        void Update(T obj);
        void Delete(K id);
        void Save();
    }

推荐阅读