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 đó!
Nguồn
2009-06-27 20:58:57