2009-06-27 47 views
6

Tôi đang tạo mẫu nhà máy cơ sở dữ liệu cho một ứng dụng có thể làm việc với SqlServer và Oracle. Tôi đã sử dụng một cách tiếp cận tương tự như đề xuất trong bài viết sau:Mẫu nhà máy cơ sở dữ liệu với nhiều cơ sở dữ liệu

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

Bây giờ, vấn đề là ứng dụng của tôi giao tiếp với nhiều cơ sở dữ liệu trên cùng một máy chủ. Ví dụ: Tôi đang chạy vài truy vấn đối với cơ sở dữ liệu DB1 và ​​một vài truy vấn đối với DB2, cả trên SqlServer. Sử dụng bài viết trên, tôi có thể tạo một cá thể của một cơ sở dữ liệu. Làm thế nào tôi có thể sử dụng cùng một cách tiếp cận để làm việc với nhiều cơ sở dữ liệu. Ai đó có thể giúp tôi với điều này? Cảm ơn.

Trả lời

3

Tôi khuyên bạn nên xem xét mẫu lưu trữ. Với việc sử dụng một mẫu kho lưu trữ, bạn có thể tóm tắt ứng dụng của mình khỏi cơ sở hạ tầng. Điều này sau đó sẽ cho phép bạn giao tiếp với một hoặc nhiều cơ sở dữ liệu, dịch vụ web, hệ thống tệp hoặc bất kỳ nguồn dữ liệu nào khác nằm ngoài miền của bạn và các ứng dụng điều khiển trực tiếp. Với điều này, bạn có thể có một cơ sở hạ tầng đằng sau hậu trường có thể giao tiếp với nhiều nguồn dữ liệu. Một ví dụ về việc này là một ứng dụng thương mại điện tử mà gần đây tôi đã làm việc cho phép tôi nói chuyện với cơ sở dữ liệu địa phương của mình cho danh mục sản phẩm trực tiếp mà còn nói với SAP đằng sau hậu trường để ghi lại đơn đặt hàng/mua hàng mới.

Với điều này bạn có thể có mã mà các cuộc gọi vào kho mà trông giống như sau:

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

Hoặc bạn có thể nói điều gì đó dọc theo dòng:

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

Ý tưởng cơ bản đằng sau một kho lưu trữ là ứng dụng của bạn có thể thực hiện cuộc gọi vào ứng dụng để nhận dữ liệu cần thiết. Nó sẽ trả về các đối tượng miền thực tế (chẳng hạn như một Tài khoản trong ví dụ trên). Hoặc có thể trả lại IEnumerable<Account> nếu cần danh sách Tài khoản.

An thực hiện này, nơi bạn lấy dữ liệu từ hai datasources có thể trông giống như (mặc dù tôi không gợi ý lo ngại đồng hòa như thế này):

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

sở thích của tôi cho một tình huống như thế này sẽ là để tạo một lớp dịch vụ ứng dụng xử lý logic ứng dụng. Một kho lưu trữ về mặt kỹ thuật nên được quan tâm với một nguồn dữ liệu. Sau đó, bạn có thể có một kho lưu trữ khác nhau cho các cặp dữ liệu khác nhau. Trong lớp ứng dụng của bạn sẽ sau đó mới lên dụ của GetAccountByID từ kho 1 (cơ sở dữ liệu 1) và nếu nó là null ... lớp ứng dụng sau đó sẽ nhúng vào kho thứ hai (ví dụ 2 cơ sở dữ liệu). Kho lưu trữ phải tuân thủ các nguyên tắc SOLID nếu có thể. Trường hợp ví dụ của tôi rõ ràng phá vỡ cách tiếp cận SOLID là có nhiều hơn một lý do cho việc thực hiện GetAccountByID để thay đổi!

Nhưng ... nếu đây là những gì bạn cần ... có cách để làm điều đó!

Các vấn đề liên quan