2009-06-27 18 views
6

SqlServer ve Oracle ile çalışabilmesi gereken bir uygulama için bir veritabanı fabrika kalıbı oluşturuyorum.Veritabanı Fabrika desen birden çok veritabanında

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

Şimdi, sorun benim uygulama aynı sunucuda birden fazla veritabanı ile iletişim kurar şudur: Aşağıdaki makalede önerilen benzer bir yaklaşım kullandım. Örneğin: SqlServer'da DB1 veritabanına ve DB2'ye karşı birkaç sorguya karşı birkaç sorgu çalıştırıyorum. Yukarıdaki makaleyi kullanarak bir veritabanı örneğini oluşturabilirim. Birden çok veritabanında çalışmak için aynı yaklaşımı nasıl kullanabilirim. Birisi bana bununla ilgili yardım edebilir mi? Teşekkürler.

cevap

3

Depo desenine bakmanızı öneririm. Bir havuz kalıbı kullanılarak, uygulamanızı altyapıdan uzaklaştırabilirsiniz. Bu, bir veya daha fazla veritabanını, web hizmetlerini, dosya sistemini veya etki alanınızın dışındaki tüm veri kaynaklarını ve uygulamaları doğrudan denetlemenizi sağlar. Böylece, sahnelerin arkasındaki çoklu veri kaynakları ile iletişim kurabilecek bir altyapıya sahip olabilirsiniz. Bunun bir örneği, yakın zamanda üzerinde çalıştığım ve doğrudan ürün kataloğu için yerel veritabanımla konuşmamı sağlayan ve aynı zamanda yeni siparişlerin/satın alımların kaydedilmesi için SAP'nin arkasındaki SAP ile konuşmamı sağlayan bir e-ticaret uygulamasıydı. Bununla

Böyle bir şey görünüyor depoya çağıran kodu olabilir:

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

Yoksa çizgisinde bir şey söyleyebiliriz:

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

bir arkasındaki temel fikir depo, uygulamanızın ihtiyaç duyduğu verileri almak için çağrı yapabilmesidir. Gerçek etki alanı nesnelerini (yukarıdaki örnekte bir Hesap gibi) döndürür. Veya Hesapların bir listesi gerekiyorsa IEnumerable<Account> dönebilir.

(Böyle eş-karışarak kaygıları önermiyoruz gerçi) İki datasources verileri yakalar nerede Buna bir uygulama gibi görünebilir:

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; 
    } 
} 

Bunun gibi bir durum için benim tercih olacaktır Uygulama mantığını işleyen bir uygulama hizmeti katmanı oluşturmak için Bir havuz teknik olarak bir veri kaynağıyla ilgilenmelidir. Daha sonra çift farklı veri kaynağı için birkaç farklı depoya sahip olabilirsiniz. Uygulama katmanınızda, GetAccountByID örneğini depo 1'den (veritabanı 1) yeni olacaktı ve eğer boşsa ... uygulama katmanı daha sonra ikinci depoya (örneğin veritabanı 2) girecekti. Depo mümkünse SOLID prensiplerine uymalıdır. Örneğimin SOLID yaklaşımını açıkça kırdığı yerde, GetAccountByID'in bu uygulamasının değişmesi için birden fazla sebep var!

Ama eğer ihtiyacınız olan şey buysa ... bunu yapmanın bir yolu var!

İlgili konular