具有多个数据库的Database Factory模式

6 c# asp.net

我正在为应该能够使用SqlServer和Oracle的应用程序创建数据库工厂模式.我使用了以下文章中建议的类似方法:

http://www.primaryobjects.com/CMS/Article81.aspx

现在,问题是我的应用程序与同一服务器上的多个数据库进行通信.例如:我在SqlServer上对数据库DB1运行的查询很少,而对DB2的查询很少.使用上面的文章,我可以创建一个数据库的实例.如何使用相同的方法处理多个数据库.有人可以帮我这个吗?谢谢.

And*_*mer 3

我建议您看一下存储库模式。通过使用存储库模式,您可以将应用程序从基础架构中抽象出来。这样您就可以与一个或多个数据库、Web 服务、文件系统或域和应用程序直接控制之外的任何其他数据源进行通信。有了这个,您就可以拥有一个可以在幕后与多个数据源进行通信的基础设施。这方面的一个例子是我最近开发的一个电子商务应用程序,它允许我与本地数据库对话以获取直接产品目录,而且还可以在幕后与 SAP 对话以记录新订单/购买。

有了这个,您可能会有调用存储库的代码,如下所示:

AccountRepository _repository = new AccountRepository();
Account account = _repository.GetAccountByID(32);
Run Code Online (Sandbox Code Playgroud)

或者你可以这样说:

Account account = new AccountRepository().GetAccountByID(32);
Run Code Online (Sandbox Code Playgroud)

存储库背后的基本思想是您的应用程序可以调用它来获取所需的数据。它将返回实际的域对象(例如上例中的帐户)。IEnumerable<Account>或者,如果需要帐户列表,它可能会返回。

从两个数据源获取数据的实现可能看起来像这样(尽管我不建议像这样混合关注):

public class AccountRepository
{
    public Account GetAccountByID(int accountID)
    {
        Account result = null;

        using(MyDataContext dc = new ConnectionFactory.GetConnection(Databases.DB1))
        {
            result = dc.Accounts.Where(a=>a.AccountID == accountID).FirstOrDefault();
        }

        //result is null...go to the other database to get an Account
        if(result == null)
        {
            using(MyDataContext dc = new ConnectionFactory.GetConnection(Databases.DB2))
            {
                result = dc.Accounts.Where(a=>a.AccountID == accountID).FirstOrDefault();
            }
        }

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

我对这种情况的偏好是创建一个处理应用程序逻辑的应用程序服务层。从技术上讲,存储库应该关注一个数据源。然后,您可以为这几个不同的数据源创建几个不同的存储库。然后,在您的应用程序层中,将从存储库 1(数据库 1)中新建 GetAccountByID 实例,如果它为空...应用程序层将深入到第二个存储库(例如数据库 2)。如果可能的话,存储库应遵循 SOLID 原则。我的示例明显打破了 SOLID 方法的地方在于,更改 GetAccountByID 的实现有不止一个原因!

但是...如果这是您需要的...有一种方法可以做到!