【发布时间】:2017-08-11 13:42:58
【问题描述】:
我有一个现有的 C# 应用程序,我打算让数据库引擎完全从业务逻辑中抽象出来。
这是我的制作方法-
public abstract class DbEngine // I can also make it an Interface
{
}
public class SQLDBEngine : DbEngine
{
public bool ExecuteSP(string SPName)
{
}
public void ExecuteInlineQuery(String SQLQuery)
{
}
}
public class MySQLDBEngine : DbEngine
{
public bool ExecuteSP(string SPName)
{
}
public void ExecuteInlineQuery(String SQLQuery)
{
}
}
然后我有一个工厂类,它负责实例化适当的 DbEngine 对象 -
public class ConnectionManager
{
string CurrentEngine;
public ConnectionManager()
{
// Read from configuration file to know which database to configure
// Config returns wither MS or MY
// MS = SQLDBEngine
// MY = MYSQLDBEngine
}
public DbEngine GetDBInstance()
{
switch(CurrentEngine)
{
case "MS":
return new SQLDBEngine();
case "MY":
return new MySQLDBEngine();
default:
return new SQLDBEngine();
}
}
}
业务逻辑将只与 ConnectionManager 对象交互,从而完全从中抽象出数据库。
客户端将与以下代码交互-
ConnectionManager conn = new ConnectionManager();
DBEngine obj = conn.GetDBInstance();
obj.ExecuteInlineQuery("select * from tblItems");
这里的问题是,如果我们引入 MongoDBEngine 作为新的数据库引擎,这将再次需要 MongoDBEngine 类 - 但由于它没有类似存储过程的功能,所以 ExecuteSP 没有意义,因此业务逻辑调用将失败。
我只是试图从业务逻辑中封装数据库引擎,这样当数据库发生变化时,业务逻辑不应该发生任何变化。
有没有我可以遵循的设计模式或技术?
【问题讨论】:
-
微软的实体框架就是这样做的一个尝试:它为所连接的任何数据库提供了一个抽象的(基于 LINQ 的)接口,并且它掩盖了其特定于实现的连接器中缺失的功能。例如,它可以将查询转换为 tsql 和 pl/SQL。祝你好运,如果你要自己实现它,我曾经为 mssql、pl/SQL、mysql 和 access 做过,把自己限制在四个数据库系统功能的一个公共子集是一个巨大的痛苦。无论如何,抽象然后使用
ExecuteInlineQuery是毫无意义的 IMO。
标签: c# asp.net design-patterns