2009-07-13 33 views
7

Tệ đến mức nào? Tôi đã đọc vô số bài báo và không bao giờ tạo ra DataContracts trừu tượng với hành vi trước đây, nhưng có vẻ như làm như vậy sẽ giải quyết được vấn đề mà tôi đang gặp phải sẽ ngăn cản tôi tạo ra các nhà máy ở khắp mọi nơi để xác định thực hiện lớp con. Câu hỏi của tôi là, tôi sẽ bị trừng phạt nếu tôi quyết định thêm hành vi vào hợp đồng dữ liệu của tôi? Tất nhiên họ không thể được tiêu thụ và có để thực hiện một số hoạt động cụ thể cho loại phân lớp đó trước khi gọi các cuộc gọi kho lưu trữ và dữ liệu được duy trì. Tôi có thể tạo các lớp "Manager" cho mỗi phân lớp nhưng điều đó đặt tôi trở lại các nhà máy và tôi đang cố gắng tiếp cận đa hình hơn. Cảm ơn trước.DataContracts với hành vi

Trả lời

7

Tại sao bạn không thể tạo hợp đồng dữ liệu (MyDataContract) theo kiểu cổ điển, chỉ các trường dữ liệu, không có gì khác và sau đó lấy được lớp hành vi của bạn từ nó?

public class BehaviorialClass : MyDataContract 
{ 
..... 
} 

Bằng cách đó, bạn có một tốt đẹp, tách sạch các mối quan tâm, hợp đồng dữ liệu của bạn không phải là "ô nhiễm" bởi hành vi đó có thể không thực sự đối phó với anyway .....

Marc

6

Một thỏa hiệp tốt để đưa hành vi trực tiếp vào DataContracts của bạn sẽ xác định hành vi là extension methods trong cùng một hội đồng như Hợp đồng của bạn hoặc một hội đồng khác hoàn toàn. Tùy chọn, các phương pháp mở rộng có thể được đặt trong một không gian tên riêng biệt từ các hợp đồng để tiếp tục cách ly sự tách biệt của dữ liệu và hành vi.

Bằng cách đó, Hợp đồng của bạn được giữ sạch sẽ nhưng đồng thời, người tiêu dùng .NET của hợp đồng của bạn sẽ có cách dễ dàng để nhập chức năng bổ sung liên quan đến DataContracts đó.

12

Bạn có thể thêm tất cả hành vi bạn muốn vào hợp đồng dữ liệu của mình. Bạn nên ghi rõ thực tế là hành vi sẽ không hiển thị với khách hàng, hoặc ai đó sẽ thất vọng sau này. Ngoài ra tài liệu thực tế là chăm sóc phải được thực hiện để không thêm bất kỳ dữ liệu thực hiện phụ thuộc vào hợp đồng dữ liệu, vì nó không phải bất cứ điều gì bạn muốn vượt qua cho khách hàng.

Tất cả trong tất cả, tôi nghĩ bạn nên tốt hơn để cho hợp đồng dữ liệu là hợp đồng dữ liệu và để thoát khỏi hành vi đó.

+0

'Tôi nghĩ rằng bạn nên tốt hơn để cho phép hợp đồng dữ liệu là hợp đồng dữ liệu và để lại hành vi của họ.' MỞ R THNG! –

0

Tại một thời điểm nào đó bạn sẽ muốn sử dụng MemberwiseClone và triển khai giao diện mà không cần dịch trung gian dữ liệu không cần thiết (và thậm chí tệ hơn, không cần thiết BẢO DƯ)NG). Các phương thức mở rộng là khi bạn theo nghĩa đen không có quyền kiểm soát đối với định nghĩa đối tượng nhưng vẫn cần sự lưu loát hướng đối tượng; họ thêm công việc bận rộn trong bất kỳ tình huống nào khác và phân tán các định nghĩa lớp tồi tệ hơn C/C++. Buck các "xu hướng" và làm những gì làm việc cho bạn, bạn chỉ có thể khám phá một mô hình mà thay đổi toàn bộ ballgame (như AsyncEnumerator của Jeffrey Richter).