我应该在 DAL 中使用哪种设计模式,同时拥有具有不同模型的多个数据库源?

Posted

技术标签:

【中文标题】我应该在 DAL 中使用哪种设计模式,同时拥有具有不同模型的多个数据库源?【英文标题】:What design pattern should I use in DAL while having multiple database sources with different models? 【发布时间】:2021-09-15 11:15:52 【问题描述】:

我有一个已经存在的 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 层中,我有一个主接口和类,看起来像存储库模式,接口就是这样的

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 操作?我需要不同的上下文还是使用同一个工厂来区分不同的数据库类?

【问题讨论】:

【参考方案1】:

你可以让你的界面更通用

 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();
    

【讨论】:

以上是关于我应该在 DAL 中使用哪种设计模式,同时拥有具有不同模型的多个数据库源?的主要内容,如果未能解决你的问题,请参考以下文章

新的 .NET 3.5 项目:使用哪种 DAL 技术?

采取哪种 DAL 方法?

具有多个数据库的数据访问层的设计

存储库模式:DAL 或 BLL [关闭]

我应该在通知系统中使用哪种设计模式?

使 DAL 可扩展的模式/想法/经验