2012-06-29 34 views
5

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?

+0

Tôi khuyên bạn nên xem http://en.wikipedia.org/wiki/Domain-driven_design – HatSoft

Trả lời

7

Tôi không thích DTO, vì chúng có nghĩa là tạo phân cấp kép với ít hoặc không có giá trị.

Tôi cũng không thích ý tưởng tạo các đối tượng mô hình chịu trách nhiệm về sự kiên trì của chính chúng. Tôi thích một lớp kiên trì riêng biệt. Tại sao? Các đối tượng mô hình không phải lúc nào cũng cần được duy trì để hữu ích. Logic và chức năng nghiệp vụ là trực giao với sự bền bỉ.

Nếu bạn có hai lớp, bạn có thể giữ biểu đồ phụ thuộc một chiều: kiên trì biết về mô hình, nhưng mô hình không biết về sự kiên trì. Bạn kết thúc với sự phụ thuộc theo chu kỳ nếu các đối tượng mô hình chịu trách nhiệm cho sự bền bỉ. Bạn không bao giờ có thể thử nghiệm hoặc sử dụng các đối tượng mô hình mà không cần kiên trì.

Lời khuyên của tôi? Đừng làm DTO. Phá vỡ một lớp kiên trì riêng biệt.

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