Tôi đang trải qua một cuộc khủng hoảng kiến trúc triết học giữa sự nghiệp. Tôi thấy những dòng rất rõ ràng giữa những gì được coi là mã khách hàng (UI, Web Services, MVC, MVP, vv) và Service Layer. Tuy nhiên, các đường từ lớp Dịch vụ trở nên mờ hơn theo từng phút. Và tất cả bắt đầu với khả năng truy vấn mã với LINQ và khái niệm tải Lười biếng.Khả năng truy vấn và tải kém trong C# có làm mờ các dòng truy cập dữ liệu và Logic kinh doanh không?
Tôi đã tạo Lớp kinh doanh bao gồm Hợp đồng và triển khai. Các triển khai sau đó có thể có sự phụ thuộc vào các Hợp đồng khác và như vậy. Điều này được xử lý thông qua một IoC Container với DI. Có một dịch vụ xử lý DataAccess và tất cả những gì nó làm là trả về một UnitOfWork. UnitOfWork này tạo ra một giao dịch khi mở rộng và cam kết dữ liệu trên phương thức Commit. [View this Article (Testability and Entity Framework 4.0)]:
public interface IUnitOfWork : IDisposable {
IRepository<T> GetRepository<T>() where T : class;
void Commit();
}
Các Repository là chung chung và các công trình chống lại hai triển khai (EF4 và một InMemory DataStore). T được tạo thành từ các POCO được tạo ra từ lược đồ cơ sở dữ liệu hoặc ánh xạ EF4. Testability được xây dựng trong thiết kế Repository. Chúng tôi có thể tận dụng việc triển khai trong bộ nhớ để khẳng định kết quả với kỳ vọng.
public interface IRepository<T> where T : class {
IQueryable<T> Table { get; }
void Add(T entity);
void Remove(T entity);
}
Khi nguồn dữ liệu bị trừu tượng, IQueryable vẫn cung cấp cho tôi khả năng tạo truy vấn ở bất kỳ nơi nào tôi muốn trong logic nghiệp vụ. Đây là một ví dụ.
public interface IFoo {
Bar[] GetAll();
}
public class FooImpl : IFoo {
IDataAccess _dataAccess;
public FooImpl(IDataAccess dataAccess) {
_dataAccess = dataAccess;
}
public Bar[] GetAll() {
Bar[] output;
using (var work = _dataAccess.DoWork()) {
output = work.GetRepository<Bar>().Table.ToArray();
}
return output;
}
}
Giờ đây, bạn có thể xem các truy vấn có thể phức tạp hơn như thế nào khi bạn thực hiện kết hợp với bộ lọc phức tạp.
Vì vậy, câu hỏi của tôi là:
- Liệu nó có vấn đề là không có sự khác biệt rõ ràng giữa BLL và DAL?.
- Khả năng truy vấn được coi là truy cập dữ liệu hoặc logic nghiệp vụ khi ở phía sau lớp Kho lưu trữ hoạt động như trừu tượng InMemory?
Bổ sung: Tôi càng nghĩ về điều đó, có lẽ câu hỏi thứ hai là câu hỏi duy nhất nên được hỏi.
+1 cho điểm đầu tiên, đặc biệt là – arootbeer
+1. Mục đích đầu tiên, triết học thứ hai. –
Điểm đầu tiên của bạn là lo lắng của tôi. Mặc dù vậy, EF4 có thể tạo các đối tượng miền sudo với các khả năng ánh xạ của nó, nếu bạn thực hiện thay đổi trong lược đồ DB, rất có thể bạn muốn truyền những thay đổi đó cho các đối tượng EF4 - do đó ảnh hưởng đến logic nghiệp vụ của bạn. Tác động đó có thể được giảm thiểu bằng cách thực hiện hồi quy trên các bài kiểm tra đơn vị của bạn. Nhưng thay đổi là một sự thay đổi. –