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

时间:2009-06-27 19:54:42

标签: c# asp.net

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

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

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

1 个答案:

答案 0 :(得分:3)

我建议你看一下存储库模式。通过使用存储库模式,您可以将应用程序从基础结构中抽象出来。这将允许您与一个或多个数据库,Web服务,文件系统或域外的任何其他数据源以及应用程序直接控制进行通信。通过这种方式,您可以拥有一个基础架构,可以在幕后与多个数据源进行通信。这方面的一个例子是我最近工作的电子商务应用程序,它允许我与我的本地数据库谈论直接产品目录,但也在后台与SAP交谈以记录新订单/购买。

通过这种方式,您可能拥有调用存储库的代码,如下所示:

AccountRepository _repository = new AccountRepository();
Account account = _repository.GetAccountByID(32);

或者您可以说出以下内容:

Account account = new AccountRepository().GetAccountByID(32);

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

我对这种情况的偏好是创建一个处理应用程序逻辑的应用程序服务层。从技术上讲,存储库应该关注一个数据源。然后,您可以为几个不同的数据源提供几个不同的存储库。然后,在您的应用程序层中,将从存储库1(数据库1)中新建GetAccountByID实例,如果它为null,则应用程序层将进入第二个存储库(例如,数据库2)。如果可能,存储库应遵循SOLID原则。我的例子清楚地说明了SOLID方法的原因是GetAccountByID的实现有多个原因需要改变!

但是......如果这是你需要的......有办法做到这一点!