我建议您看一下存储库模式。通过使用存储库模式,您可以将应用程序从基础架构中抽象出来。然后,这将允许您与一个或多个数据库、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 的实例,如果它为空……应用程序层将进入第二个存储库(例如数据库 2)。如果可能,存储库应遵循 SOLID 原则。我的示例清楚地打破了 SOLID 方法的地方在于,GetAccountByID 的实现改变的原因不止一个!
但是...如果这是您需要的...有办法做到这一点!