2009-06-27 6 views
6

Ich erstelle ein Datenbank-Factory-Muster für eine Anwendung, die in der Lage sein soll, mit SqlServer und Oracle zu arbeiten. Ich habe einen ähnlichen Ansatz in dem folgenden Artikel vorgeschlagen verwendet:Datenbank Factory-Muster mit mehreren Datenbanken

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

Nun, das Problem ist, dass meine Anwendung mit mehreren Datenbanken auf demselben Server kommuniziert. Für Beispiel: Ich führe einige Abfragen gegen Datenbank DB1 und wenige Abfragen gegen DB2, beide auf SqlServer. Mit dem obigen Artikel konnte ich eine Instanz einer Datenbank erstellen. Wie kann ich denselben Ansatz für die Arbeit mit mehreren Datenbanken verwenden? Kann mir jemand dabei helfen? Vielen Dank.

Antwort

3

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!

Verwandte Themen