数据库访问的抽象

时间:2016-02-23 08:12:21

标签: c# .net repository-pattern

我需要遍历一个抽象类的实例列表,每个实例都实现一个从数据库加载数据的方法。为简单起见,我们假设Abstract类只包含该方法: 抽象类

public abstract class AManagerBase
{
    public abstract Response InitiateManagerResources(IDataManager dbManager);
}

当编写从此基类派生的类时,通过调用IDataManager的方法ExecuteCommand来实现该方法,该方法接受SQL命令以从数据库中的该类的表中检索数据。 例如:

var tableData = dataManager.ExecuteCommand($"SELECT DC.* FROM {CLASS_TABLE_NAME} DC");

我想对数据库访问使用某种抽象而不是发送SQL命令。我读到了Repository Pattern,但我的问题是,将来编写的每个类在数据库中都有自己的表,并且有自己的数据,每次类都不能将实体添加到共享模块书面。 最重要的是,我希望将来能够将数据库(当前使用Access DB)复制到其他数据库(可能是xml文件),而无需更改所有已编写的库。 还有一些例子:

// Independent library A.dll
// A.dll has a table named A_Table in the DB
public class ClassA : AManagerBase
{
    public override Response InitiateManagerResources(IDataManager dbManager)
    {
        var loadedData = dbManager.ExecuteCommand("Select ...");
        // create my own defined entities from the returned data
    }
}

// Independent library B.dll
// B.dll has two tables named B_Table1 and B_Table2 in the DB
public class ClassB : AManagerBase
{
    public override Response InitiateManagerResources(IDataManager dbManager)
    {
        var loadedData = dbManager.ExecuteCommand("Select ...");
        // create my own defined entities from the returned data
    }
}

感谢。

1 个答案:

答案 0 :(得分:0)

首先,在dbManager ExecuteCommand方法中,我将删除类似SELECT语句的SQL,并在内部完成,而不是在其InitiateManagerResources调用中由客户端类传入。我会有一个配置文件,将每个dll映射到他们正在访问的任何表格,即

A = A_Table B = B_Table1,表2 ...

当实例化该dll中的每个类时,要么传入构造函数中的表列表,要么让每个类自己读取它。然后将此表列表作为字符串传递给dbManager.ExecuteCommand方法,即

dbManager.ExecuteCommand(" A_Table&#34)

希望数据库管理器应该有足够的信息来执行查询并返回结果。如果/当您转移到XML时,那么唯一改变的是映射文件中数据的格式(取决于XML文件的布局)。您可以使用IDataManager的另一个实现来理解如何解析这个XML文件(也许使用Linq到XML?)但是您的客户端类不会改变,因为它们只是从映射文件中传入数据。希望这会有所帮助...