2010-10-18 5 views
5

Gần đây tôi đã tham gia một công ty sử dụng bộ dữ liệu đã nhập làm 'Dto' của họ. Tôi nghĩ rằng họ thực sự là rác rưởi và muốn thay đổi nó thành một thứ gì đó hiện đại hơn và thân thiện với người dùng hơn. Vì vậy, tôi đang cố gắng cập nhật mã để lớp dữ liệu chung chung hơn, tức là sử dụng giao diện v.v., người kia không biết Dto là gì và chúng tôi có một chút bất đồng về việc nên làm như thế nào.C# Lớp dữ liệu và Dto's

Không cố gắng gây ảnh hưởng đến mọi người theo cách suy nghĩ của mình, tôi muốn nhận được câu trả lời vô tư từ bạn về những lớp mà Dto có thể hiện diện. Tất cả các lớp; DAL, BL và Bản trình bày hoặc một bộ phụ nhỏ trong các lớp này chỉ.

Ngoài ra, liệu các đối tượng IList có nên hoặc không nên có mặt trong DAL hay không.

Cảm ơn.

+2

@leppie: xem http://rlacovara.blogspot.com/2009/03/what-is-difference-between-dto-and-poco.html – tsimbalar

+1

Đối tượng chuyển dữ liệu - ngữ cảnh nhẹ và thường (miễn phí) phiên bản của đối tượng miền kinh doanh (hoặc đối tượng). –

+0

Xin lỗi leppie, tôi không nên cho rằng mọi người đều biết từ viết tắt. –

Trả lời

5

Nó thực sự phụ thuộc vào kiến ​​trúc của bạn.

Đối với hầu hết các điểm, bạn nên cố gắng mã để giao diện sau đó nó không thực sự quan trọng những gì bạn thực hiện được. Nếu bạn trả về ISomething nó có thể là SomethingEntity của bạn hoặc SomethingDTO của bạn nhưng mã tiêu thụ của bạn không quan tâm ít miễn là nó thực hiện giao diện.

Bạn phải trả lại IList/ICollection/IEnumerable trên một tập hợp hoặc mảng cụ thể.

gì bạn nên cố gắng làm đầu tiên là tách biệt mã của bạn và làm cho nó lỏng lẻo bằng cách chèn một số giao diện giữa các lớp của bạn như một kho lưu trữ cho lớp DataAccess của bạn. Kho lưu trữ của bạn sau đó trả về các thực thể của bạn được đóng gói bởi một giao diện. Điều này sẽ làm cho mã của bạn dễ kiểm tra hơn và cho phép bạn giả lập dễ dàng hơn. Một khi bạn đã thử nghiệm tại chỗ, bạn có thể bắt đầu thay đổi việc triển khai với ít rủi ro hơn.

Nếu bạn bắt đầu sử dụng giao diện, tôi khuyên bạn nên tích hợp một IoC như Windsor sớm hơn là sau này. Nếu bạn làm điều đó từ khi đi, nó sẽ làm cho mọi thứ dễ dàng hơn sau này.

+0

Đây là tuyến đường tôi đang tìm cách giảm xuống, đặc biệt là kỹ thuật tiêm IoC và phụ thuộc và trên thực tế, đây là những gì tôi đang cố gắng giải thích cho nhà phát triển khác trong văn phòng. –

2

Một điều là DataSets kém để đạt được khả năng tương tác. Ngay cả các tập dữ liệu đã nhập cũng không tương thích khi nói đến việc tiêu thụ các tập dữ liệu đã nhập từ một máy khách không phải là .net. Tham khảo this link. Nếu bạn phải đạt được khả năng tương tác thì hãy chiến đấu khó khăn cho DTO nếu không cố gắng làm cho nhóm của bạn hiểu DTO trong một khoảng thời gian vì các tập dữ liệu không quá tệ sau tất cả.

Trên một phần của giao diện, có bạn nên phơi bày giao diện. Ví dụ: - Nếu bạn đang trả lại List<T> từ DAL, thay vào đó bạn phải trả lại IList<T>. Một số người đi đến mức độ chỉ trả lại IEnumerable<T> bởi vì tất cả những gì bạn cần là khả năng liệt kê. Nhưng sau đó trong khi thực hiện nó không trở thành astronaut architect.

Trong các ứng dụng của tôi, tôi đã tìm ra rằng trở IList<T> thay vì gây ô nhiễm List<T> cơ sở mã của tôi với các mã như thế này:

//consider personCollection as IList<Person> 
(personCollection as List<Person>).ForEach(//Do Something) 

Vì vậy, cá nhân tôi cố gắng duy trì một sự cân bằng giữa trở về giao diện hoặc đối tượng cụ thể. Nếu bạn hỏi tôi những gì tôi đang làm ngay bây giờ, sau đó tôi sẽ cho bạn biết tôi đang trở về List<T>. Tôi bị ảnh hưởng không trở thành astronaut architect.

+0

Cảm ơn Pradeep (và cho các chỉnh sửa). –

+2

Có lý do không trả lại danh sách chung http://msdn.microsoft.com/en-US/library/ms182142(v=VS.80).aspx. Nó phụ thuộc nếu đối tượng trả về Danh sách là công khai hoặc riêng tư. Miễn là bạn không tiết lộ danh sách trên một giao diện công cộng, nó không quan trọng bởi vì chỉ có bạn đang tiêu thụ nó. – Bronumski

+1

Có, tôi đồng ý nếu các phương tiện công cộng được một người nào đó ngoài ứng dụng của bạn tiêu thụ. Không nên suy ra công khai như là trình chỉ định truy cập và không có ý nghĩa của việc hiển thị kiểu trả về công khai làm giao diện nếu nó luôn được tiêu thụ bởi một số lớp trong dự án của bạn mà sẽ không bao giờ thấy ánh sáng bên ngoài một ứng dụng. – Pradeep

1

Tôi luôn sử dụng DTO, không bao giờ DataTable. Nhưng tôi chỉ sử dụng chúng để chuyển từ BL sang DL và ngược lại. Các lớp trình bày của tôi thường chỉ nhận thức được các lớp kinh doanh và dịch vụ trong trường hợp định hướng dịch vụ.

Những lợi ích tôi có thể thấy sử dụng DTOs hơn datatables:

  • dễ refactoring
  • sản xuất dễ dàng sơ đồ
  • mã sạch dễ đọc hơn, đặc biệt là trong đơn vị của Dal kiểm tra
+0

Cảm ơn vc - thẳng đến điểm câu hỏi của tôi, bất kỳ ý kiến ​​nào về việc đưa Dto vào IEnumerable hoặc tương tự? –

+0

Bạn có nghĩa là ví dụ cho phép một phương pháp GetCustomers trong DAL trả về một IList hoặc IEnumerable của CustomerDTO? Nếu vậy, tôi không thấy lý do nào khiến bạn không nên cho phép. –

+0

Cảm ơn vc - đó là chính xác những gì tôi có nghĩa là –

1

Theo định nghĩa, DTO là một đối tượng truyền dữ liệu, được sử dụng để (đợi) chuyển dữ liệu từ lớp này sang lớp khác.

DTO có thể được sử dụng trên tất cả các lớp và tôi đã sử dụng chúng tốt với các dịch vụ web.

+1

Cảm ơn Burt, tôi thích cách bạn 'tiết lộ' một DTO là gì :) –

+0

Đừng lo lắng, hãy xem thiết kế điều khiển tên miền như DTO được giới thiệu trong đó. Có một số ví dụ tuyệt vời về việc làm thế nào để kiến ​​trúc sư một giải pháp với các quy tắc kinh doanh phức tạp bằng cách sử dụng DDD. – Burt

+0

Dưới đây là một vài liên kết dành cho bạn http://dddpds.codeplex.com/ http://ncommon.codeplex.com/ – Burt