Cố gắng triển khai kiến trúc 3 lớp (không: tầng, tôi chỉ muốn tách biệt dự án của mình một cách hợp lý, trên một máy) tôi đã tìm thấy rất nhiều cách tiếp cận khác nhau mà tôi đang bối rối , cách tốt nhất (nếu có) để thực hiện điều đó trong ứng dụng WinForms.Kiến trúc 3 lớp - truyền dữ liệu giữa các lớp
Bây giờ tôi không có nghi ngờ chỉ khoảng 3 lớp nên được trình bày trong dự án:
- UI (Presentation Layer)
- BLL (Business Logic Layer)
- DAL (Data Acces Layer)
Trong UI Tôi đặt tất cả WinForms. Cũng phải có một số logic để điền vào đối tượng với dữ liệu từ các điều khiển và chuyển nó vào lớp BLL.
Trong Dal tôi muốn đưa các lớp học và phương pháp để thao tác dữ liệu sử dụng ADO.NET, như:
public class OrderDAL
{
public OrderDAL()
{
}
public int Add(Order order)
{
//...add order to database
}
public int Update(Order order)
{
//...update order in database
}
//...etc.
}
Vấn đề là với BLL và câu hỏi - tôi nên sử dụng Truyền dữ liệu Objects để chuyển dữ liệu giữa các lớp, hoặc tôi có nên vượt qua cả lớp không?
Nếu tôi chọn sử dụng DTO, sau đó tôi đã tạo thêm lớp phổ biến, Order
, mà tham chiếu đến giao diện người dùng, BLL và DAL:
public class Order
{
public int Id { get; set; }
public DateTime Date { get; set; }
public string Number { get; set; }
public string CustomerName { get; set; }
public Order()
{
}
}
và đặt logic tách vào BLL :
public class OrderBLL
{
public OrderBLL()
{
}
public int Add(Order order)
{
OrderDAL orderDAL = new OrderDAL();
return orderDAL.Add(order);
}
public int Update(Order order)
{
OrderDAL orderDAL = new OrderDAL();
return orderDAL.Update(order);
}
//...etc.
}
Cách tiếp cận này, dưới tên gọi khác nhau, được sử dụng trong số các tên khác: here hoặc here.
Mặt khác, một số "người khôn ngoan" và những người theo dõi của họ (như here) gọi nó là Anemic Domain Model và khiếu nại đó là một thiết kế xấu và chống mẫu không nên được sử dụng.
Các ưu:
- DTO có thể dễ dàng do thiết kế để đại diện cho bảng cơ sở dữ liệu,
- đó là ánh sáng và rõ ràng, chỉ chứa các lĩnh vực cần thiết cho cơ sở dữ liệu,
- Dal không nhất thiết phải tham khảo BLL,
Các nhược điểm:
- chống mẫu (âm thanh đáng sợ; P),
- vi phạm OOP (tính tách ra từ phương pháp),
- vì logic là trong lớp học khác nhau, nó có thể khó khăn hơn để duy trì khi có điều gì thay đổi.
Vì vậy, cách tiếp cận ngược lại là phải vượt qua toàn bộ đối tượng giữa các lớp, như here: không DTO, chỉ BLL trông như rằng:
public class Order
{
public int Id { get; set; }
public DateTime Date { get; set; }
public string Number { get; set; }
public string CustomerName { get; set; }
public Order()
{
}
public int Add()
{
OrderDAL orderDAL = new OrderDAL();
return orderDAL.Add(this);
}
public int Update(Order order)
{
OrderDAL orderDAL = new OrderDAL();
return orderDAL.Update(order);
}
}
Các ưu:
- nó là một đối tượng đóng gói độc đáo, tuân theo các quy tắc OOP (tôi giả sử;)).
- cả logic và thuộc tính đều ở cùng một nơi, dễ bảo trì và gỡ lỗi hơn.
Các nhược điểm:
- để sử dụng đối tượng, Dal có để tham khảo BLL (đó không phải là cách lớp 3 tầng nên làm, phải không?).
- lớp có thể chứa một số trường không được sử dụng trong Cơ sở dữ liệu, cũng như một số trường từ Cơ sở dữ liệu (như Id) không đại diện cho đối tượng "thực tế".
Vì vậy, có vẻ như bất cứ điều gì tôi chọn, tôi sẽ vi phạm một số quy tắc. Cách tốt hơn thì tôi nên chọn cái nào? Có lẽ có cách tiếp cận khác tôi đã không tìm thấy?
Tôi khuyên bạn nên xem http://en.wikipedia.org/wiki/Domain-driven_design – HatSoft