c# - 在拥有具有不同模型的多个数据库源时,我应该在 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 操作?我是否需要不同的上下文或在工厂中使用相同的上下文来区分不同的数据库类?
解决方案
你可以让你的界面更通用
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();
}
推荐阅读
- postgresql - 删除员工时,删除 Works_On 和 Dependent 中的引用行
- html - Angular 7:动态生成模板
- html - 我正在制作一个网站,但我的关于我们选项卡上有问题
- html - 水平和垂直居中引导连续行中的 4 列
- python - Flask-Security 错误 - NameError:未定义全局名称“verify_and_update_password”
- python - ax.twinx().twiny() 右侧 y 轴的刻度和标签不可移除
- shell - 从 shell 脚本中的键值对为变量赋值
- amazon-redshift - Redshift 中的 LAG 窗口函数 - 在单行中显示上一年和当前年份的值
- python - Python Pandas:“loc”和“iloc”代表什么?
- php - 检查,在 PHP 中;如果连接的动态 mySQL 数据库发生了变化?