Trong ngữ cảnh của ứng dụng n-tier, có sự khác biệt nào giữa những gì bạn sẽ xem xét các lớp truy cập dữ liệu và kho lưu trữ của bạn không?Kho lưu trữ và truy cập dữ liệu
Tôi có xu hướng nghĩ có nhưng tôi chỉ muốn xem suy nghĩ khác. Suy nghĩ của tôi là công việc của kho lưu trữ chỉ chứa và thực thi truy vấn thô, nơi mà lớp truy cập dữ liệu sẽ tạo ngữ cảnh, thực thi kho lưu trữ (đi trong ngữ cảnh), xử lý ánh xạ mô hình dữ liệu cho mô hình miền và trả lại kết quả sao lưu ...
Các bạn nghĩ sao? Ngoài ra bạn có thấy bất kỳ điều này thay đổi trong một kịch bản LINQ to XML (giả sử rằng bạn thay đổi ngữ cảnh cho XDocument có liên quan) không?
Cheers Anthony
UPDATE:
Đây là cách mà tôi sẽ thường thực hiện việc này trước:
public class TermBl : ITermBl
{
public IEnumerable<ITerm> GetAll(IListParameter criteria)
{
//Any pre business logic
var dataLayer = this.CreateDataLayer();
var result = dataLayer.GetAll(criteria);
//Any post business logic
return result;
}
... Other methods
}
public class TermDa : ITermDa
{
public IEnumerable<ITerm> GetAll(IListParameter criteria)
{
//Linq query
var dataResult = ....ToList()
var mappedResult = this.FromDataToDomain(dataResult);
//Note the mapping isn't done in this object, the actual
// mapping is handled by a separate component
return mappedResult;
}
... Other methods
}
Bạn có thấy bất kỳ vấn đề cố hữu ở đây với các mô hình nói chung ..
Đối với kho lưu trữ nơi tôi đã nghĩ đến việc sử dụng nó thay vì truy vấn trực tiếp trong GetAll của TermDa Phương pháp tôi sẽ thay đổi nó để tìm một cái gì đó như thế này:
public class TermDa : ITermDa
{
public IEnumerable<ITerm> GetAll(IListParameter criteria)
{
var repository = this.CreateRepository();
var dataResult = repository.GetAll(..., criteria).ToList();
var mappedResult = this.FromDataToDomain(dataResult);
return mappedResult;
}
... Other methods
}
public class TermRepository : ITermRepository
{
public IQueryable<ITerm> GetAll(IMyContext context, IListParameter criteria)
{
//Linq query
return ...;
}
... Other queries
}
này như thế nào các bạn nhìn thấy nó làm việc hay không thực sự ... Có hay không có kho lưu trữ là tôi thấy một trong hai điều trên hoàn toàn bảo vệ các lớp kinh doanh từ biết bất kỳ điều gì về phương pháp/công nghệ truy cập dữ liệu được sử dụng ...
Vì vậy, bạn có thấy đối tượng DAL sử dụng đối tượng kho lưu trữ không? tức là khi bạn nói phát hành truy vấn, tôi nghĩ rằng nó sẽ làm điều này bằng cách gọi kho lưu trữ ... gần giống như kho lưu trữ là proxy để lưu trữ procs trong cơ sở dữ liệu, ngoại trừ truy vấn trong kho ... –
@vdh_ant: Không , một DAL thường không có bất kỳ kiến thức nào về mô hình miền. Việc triển khai kho lưu trữ (không phải kiểu giao diện/cơ sở của nó) có thể sử dụng DAL, mặc dù hầu hết các dự án mới ngày nay thậm chí không có DAL, tất cả đều được đóng gói trong ORM.Kho lưu trữ là ** không ** proxy cho các đối tượng cơ sở dữ liệu, bạn đã hiểu nhầm nó là gì. – Aaronaught
@Aaronaught: đặt kho lưu trữ một bên trong giây lát, khi bạn nói "DAL thường không có bất kỳ kiến thức nào về mô hình miền", điều này đi ngược lại những gì tôi đã thấy xung quanh địa điểm ... suy nghĩ từ giao diện/giao diện hợp đồng DAL phải trả lại một cái gì đó và tôi chủ yếu thấy rằng một cái gì đó là mô hình miền. Khi tôi nghĩ về những gì khác nó có thể là nó chỉ có thể là các mô hình dữ liệu ... Tôi đã nghĩ rằng điều này là xấu vì nhiều lý do. Chủ yếu là vì lớp logic nghiệp vụ của bạn bây giờ được kết hợp với một mô hình dữ liệu cụ thể cho các công nghệ khác nhau ... –