C# 具有多个数据库的数据库工厂模式

C# 具有多个数据库的数据库工厂模式,c#,asp.net,C#,Asp.net,我正在为一个应用程序创建一个数据库工厂模式,该应用程序应该能够与SqlServer和Oracle一起工作。我使用了以下文章中建议的类似方法: 现在,问题是我的应用程序与同一服务器上的多个数据库通信。例如:我在SqlServer上对数据库DB1运行了一些查询,对DB2运行了一些查询。使用上面的文章,我可以创建一个数据库的实例。如何使用相同的方法处理多个数据库。有人能帮我吗?谢谢。我建议您看看存储库模式。通过使用存储库模式,您可以将应用程序从基础架构中抽象出来。然后,这将允许您与一个或多个数据库、

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


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

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

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

AccountRepository _repository = new AccountRepository();
Account account = _repository.GetAccountByID(32);
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;
    }
}
或者你可以说一些大致的话:

Account account = new AccountRepository().GetAccountByID(32);
存储库背后的基本思想是,您的应用程序可以调用存储库以获取所需的数据。它将返回实际的域对象(如上面示例中的帐户)。或者,如果需要帐户列表,它可以返回
IEnumerable

从两个数据源获取数据的实现可能如下所示(尽管我不建议这样混合关注点):

我对这种情况的偏好是创建一个处理应用程序逻辑的应用程序服务层。从技术上讲,存储库应该与一个数据源相关。然后,您可以为这两个不同的数据源创建一个不同的存储库。在您的应用程序层中,然后将从存储库1(数据库1)中新建GetAccountByID实例,如果该实例为空,则应用程序层将进入第二个存储库(例如数据库2)。如果可能,存储库应该遵循坚实的原则。我的例子显然打破了这种可靠的方法,因为GetAccountByID的实现需要改变的原因不止一个

但是…如果这是你需要的…有一种方法可以做到