我应该在 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 中使用哪种设计模式,同时拥有具有不同模型的多个数据库源?的主要内容,如果未能解决你的问题,请参考以下文章