Ich würde vorschlagen, dass Sie sich das Repository-Muster ansehen. Mit einem Repository-Muster können Sie Ihre Anwendung weg von der Infrastruktur abstrahieren. Auf diese Weise können Sie mit einer oder mehreren Datenbanken, Webdiensten, dem Dateisystem oder anderen Datenquellen kommunizieren, die sich außerhalb Ihrer Domäne und der direkten Kontrolle der Anwendungen befinden. Damit könnten Sie eine Infrastruktur haben, die im Hintergrund mit mehreren Datenquellen kommunizieren kann. Ein Beispiel dafür war eine E-Commerce-Anwendung, an der ich kürzlich gearbeitet habe und die es mir ermöglicht hat, mit meiner lokalen Datenbank für den direkten Produktkatalog zu sprechen, aber auch hinter den Kulissen mit SAP über neue Aufträge/Einkäufe zu sprechen.
Damit Sie könnten Code haben, der in das Repository aufruft, die etwa wie folgt aussieht:
AccountRepository _repository = new AccountRepository();
Account account = _repository.GetAccountByID(32);
Oder Sie können entlang der Linien von etwas sagen:
Account account = new AccountRepository().GetAccountByID(32);
Die Grundidee hinter ein Repository bedeutet, dass Ihre Anwendung Anrufe tätigen kann, um die benötigten Daten zu erhalten. Es würde tatsächliche Domänenobjekte zurückgeben (wie im obigen Beispiel ein Konto). Oder es könnte IEnumerable<Account>
zurückgegeben werden, wenn eine Liste von Accounts benötigt wird.
Eine Implementierung dieser in dem Sie Daten aus zwei Datenquellen greifen aussehen könnte (obwohl ich nicht Vermengung Bedenken wie dies vorschlagen):
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;
}
}
für eine Situation Meine Präferenz wie dies wäre Erstellen einer Anwendungsdienstschicht, die die Anwendungslogik verarbeitet Ein Repository sollte sich technisch mit einer Datenquelle befassen. Sie können dann ein anderes Repository für die verschiedenen Datenquellen haben. In Ihrer Anwendungsschicht würde dann die Instanz von GetAccountByID aus dem Repository 1 (Datenbank 1) neu erstellt und wenn es null wäre ... würde die Anwendungsschicht dann in das zweite Repository (beispielsweise Datenbank 2) eintauchen. Das Repository sollte, wenn möglich, den SOLID-Prinzipien folgen. Wo mein Beispiel den SOLID-Ansatz eindeutig durchbricht, ist, dass es mehr als einen Grund gibt, diese Implementierung von GetAccountByID zu ändern!
Aber ... wenn das ist was du brauchst ... gibt es einen Weg es zu tun!