2010-01-21 30 views
5

Tôi đang làm việc trên ứng dụng web ASP.NET sử dụng nhiều JavaScript ở phía máy khách để cho phép người dùng thực hiện những việc như kéo thả sắp xếp lại danh sách, tra cứu các mục để thêm vào danh sách (như các đề xuất trong thanh tìm kiếm của Google), xóa các mục khỏi danh sách, v.v.Duy trì tính nhất quán giữa các mô hình đối tượng JavaScript và C#

Tôi có một "lớp" JavaScript để sử dụng để lưu trữ từng mục danh sách ở phía máy khách cũng như thông tin về hành động mà người dùng đã thực hiện trên mục (thêm, chỉnh sửa, xóa, di chuyển). Thời gian duy nhất trang được đăng lên máy chủ là khi người dùng hoàn tất, ngay trước khi trang được gửi, tôi sắp xếp lại tất cả thông tin về các thay đổi đã được thực hiện thành JSON và lưu trữ nó trong các trường ẩn trên trang.

Điều tôi đang tìm kiếm là một số lời khuyên chung về cách xây dựng các lớp học của tôi trong C#. Tôi nghĩ rằng nó có thể là tốt đẹp để có một lớp trong C# phù hợp với một JavaScript vì vậy tôi chỉ có thể deserealize JSON cho các trường hợp của lớp này. Có vẻ hơi lạ khi có các lớp ở phía máy chủ vừa sao chép trực tiếp các lớp JavaScript và chỉ tồn tại để hỗ trợ triển khai UI JavaScript.

Đây là một câu hỏi trừu tượng. Tôi chỉ đang tìm kiếm một số hướng dẫn hình thức những người khác đã làm những việc tương tự trong việc duy trì phù hợp với khách hàng và các mô hình đối tượng phía máy chủ.

Trả lời

1

Tạo cảm giác hoàn hảo. Nếu tôi đang đối mặt với vấn đề này, tôi sẽ xem xét sử dụng một mô tả dứt khoát của kiểu dữ liệu hoặc lớp, và sau đó tạo mã từ mô tả đó.

Mô tả có thể là tệp nguồn javascript; bạn có thể xây dựng một trình phân tích cú pháp tạo ra mã C# thích hợp từ JS đó. Hoặc, nó có thể là một tập tin nguồn C#, và bạn thực hiện trò chuyện.

Bạn có thể tìm thấy nhiều tiện ích hơn khi mô tả nó trong RelaxNG, và sau đó xây dựng (hoặc tìm kiếm) một trình tạo cho cả C# và Javascript. Trong trường hợp này lược đồ RelaxNG sẽ được kiểm tra trong điều khiển mã nguồn, và các tạo tác được tạo ra sẽ không.


EDIT: Cũng có một spec non trẻ gọi WADL, mà tôi nghĩ rằng sẽ giúp đỡ trong vấn đề này là tốt. Tôi chưa đánh giá WADL. Về mặt ngoại vi, tôi biết rằng nó đã không làm cho thế giới bị bão, nhưng tôi không biết tại sao lại như vậy. There's a question on SO regarding that.


EDIT2: Do thiếu các công cụ (WADL rõ ràng là chết non), nếu tôi là bạn tôi có thể thử cách tiếp cận chiến thuật này:

  • Sử dụng [DataContract] thuộc tính trên C# loại và điều trị những người như dứt khoát.
  • xây dựng một công cụ ẩn trong loại C# của bạn, từ một tập hợp được biên dịch và khởi tạo loại, bằng cách sử dụng JsonSerializer trên một tài liệu XML mẫu XML, cung cấp một loại định nghĩa mô hình đối tượng defacto. Công cụ phải bằng cách nào đó xác minh rằng loại instantiated có thể đi vòng vào JSON tương đương, có thể với một checksum hoặc CRC trên các công cụ kết quả.
  • chạy công cụ đó như là một phần của quá trình xây dựng của bạn.

Để thực hiện điều này, bạn phải kiểm tra trong đó "tài liệu JSON mẫu" vào mã nguồn và bạn cũng sẽ phải đảm bảo rằng là hình thức bạn đang sử dụng trong mã JS khác nhau trong ứng dụng của bạn. Vì Javascript là động, bạn cũng có thể cần trình xác minh loại hoặc thứ gì đó, sẽ chạy như một phần của jslint hoặc một số bước xác minh thời gian xây dựng khác, điều đó sẽ kiểm tra nguồn Javascript của bạn để xem nó đang sử dụng định nghĩa mô hình objbect "chuẩn" của bạn .

+0

Cảm ơn, điều đó nghe có vẻ thú vị khi sử dụng RelaxNG. Gần đây tôi đã thực hiện một số công cụ với Bộ đệm giao thức của Google, sử dụng ngôn ngữ của riêng chúng để xác định một lớp như vậy để bạn có thể tạo phiên bản thích hợp cho bất kỳ ngôn ngữ nào bạn đang mã hóa. trong nhiều kịch bản và công nghệ khác nhau. Tôi không thể tin rằng tôi đã không nghĩ đến việc này trước đây. –

+0

ya, tôi cũng nghĩ về protobuf. Tôi tự hỏi nếu các mã được tạo ra mà đi ra khỏi một protobufs .idl là có thể sử dụng mà không có bộ nối tiếp protobufs. Nếu có, bạn có thể sử dụng JsonSerializer trong .NET, với mã C# mà công cụ protobufs tạo ra. – Cheeso

+0

Vì vậy, bạn đang gợi ý rằng tôi so sánh một thể hiện tuần tự của lớp C# với một tài liệu tĩnh chứa JSON đại diện cho cấu trúc dữ liệu của tôi. Nếu chúng khớp nhau thì tôi biết lớp C# là đúng. Sau đó, tôi sẽ so sánh các thể hiện của cùng một lớp trong JavaScript với tài liệu JSON và nếu chúng khớp với nhau thì xác minh rằng tôi sẽ có thể trao đổi dữ liệu qua lại từ máy khách đến máy chủ mà không gặp trục trặc và deserializing. –

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