2013-09-10 35 views
5

ASP.NET | MVC 4 | C# | WCFASP.NET MVC - Lớp học WCF cho Mô hình

Tôi đang sử dụng các dịch vụ web của WCF làm trung gian từ lớp trình bày (MVC) cho lớp dữ liệu (Thực thể). Để đơn giản hóa việc chuyển dữ liệu mô hình dữ liệu từ MVC sang dịch vụ web, tôi nghĩ tôi sẽ sử dụng các lớp proxy trong WCF, để có thể có một lớp tập trung. Thật không may, điều này gây ra sự mất mát của trang trí MVC trên các thuộc tính trong mô hình. Có cách nào tốt để tạo ra một lớp tập trung để sử dụng với một mô hình cho xem MVC, và cũng như một phương thức vận chuyển đến dịch vụ WCF?

Tự động đưa vào tâm trí như một lựa chọn, nhưng tôi tin rằng sẽ yêu cầu hai lớp giống hệt nhau. Một ở phía MVC và một ở phía WCF. Mà vẫn sẽ yêu cầu tôi thực hiện một sự thay đổi trên cả hai mặt nếu một tài sản thay đổi trong một lớp học.

Bất kỳ đề xuất nào khác sẽ được đánh giá cao. Cảm ơn!

EDIT :: Ví dụ

Đây là mô hình cho một trang có chứa một bảng các hồ sơ

public class ReconcileModel 
{ 
    #region PROPERTIES 

    public List<ReconcileItem> ReconcileItems { get; set;} 

    #endregion 

    #region CONSTRUCTORS 

    public ReconcileModel() 
    { 
     ReconcileItems = new List<ReconcileItem>(); 
    } 

    #endregion 
} 

Dưới đây là một lớp học để đại diện cho mỗi bản ghi trong bảng đó.

public class ReconcileItem 
{ 
    #region PROPERTIES 

    public int ID { get; set; } 
    public string Description { get; set; } 
    public string LastLocation { get; set; } 
    public string LastRead { get; set; } 
    public string IntendenLocation { get; set; } 
    public string PickId { get; set; } 
    public string OEM { get; set; } 
    public string LotNumber { get; set; } 
    public string SerialNumber { get; set; } 
    public DateTime ExpirationDate { get; set; } 
    public string ReconcileReason { get; set; } 
    public string RemoveReason { get; set; } 


    #endregion 

    #region CONSTRUCTORS 

    public ReconcileItem() 
    { 
    } 

    #endregion 
} 

Hợp đồng đại diện WCF của lớp trên sẽ là

[DataContract] 
public class ReconcileItem 
{ 
    [DataMemeber] 
    public int ID { get; set; } 
    [DataMember] 
    public string Description { get; set; } 
    [DataMember] 
    public string LastLocation { get; set; } 
    [DataMember] 
    public string LastRead { get; set; } 
    [DataMember] 
    public string IntendenLocation { get; set; } 
    [DataMemeber] 
    public string PickId { get; set; } 
    [DataMember] 
    public string OEM { get; set; } 
    [DataMember] 
    public string LotNumber { get; set; } 
    [DataMember] 
    public string SerialNumber { get; set; } 
    [DataMember] 
    public DateTime ExpirationDate { get; set; } 
    [DataMember] 
    public string ReconcileReason { get; set; } 
    [DataMember] 
    public string RemoveReason { get; set; } 
} 

Nếu tôi muốn cập nhật hồ sơ này, các lớp sẽ được gửi đến các dịch vụ WCF, ánh xạ đến các lớp học khuôn khổ tổ chức thích hợp, và lưu vào cơ sở dữ liệu. Để đơn giản hóa việc chuyển giao, tôi nghĩ rằng tôi sẽ chỉ đưa lớp này vào dự án WCF và tham khảo nó trong dự án MVC. Sau đó, tôi có thể vượt qua lớp trở lại ở giữa WCF và MVC. Ngoài ra, nếu tôi cập nhật lớp trong WCF thì nó sẽ được phản ánh trong MVC. Đó là những gì có nghĩa là tập trung.

+0

Câu hỏi của bạn hơi mơ hồ. Bạn có thể trình bày cho chúng tôi một số mã, ví dụ như thể hiện ý nghĩa của bạn bằng 'lớp tập trung'? – Steven

+0

@Steven xem chỉnh sửa và cho tôi biết nếu điều đó làm rõ mọi thứ. Cảm ơn! – Will

Trả lời

2

Cũng giống như Adrian, tôi đặt câu hỏi liệu bạn có thực sự cần dịch vụ WCF giữa DB của bạn và dịch vụ MVC hay không. Đây là một kịch bản nhiều khả năng cho một ứng dụng khách (Win Forms, WPF) mà nói chuyện với một cơ sở dữ liệu. Tôi hiện đang làm việc trên một dự án Win Forms nơi chúng tôi sử dụng WCF làm lớp trung gian và chúng tôi làm như sau:

  • Chúng tôi có một hội đồng (gọi là 'hợp đồng') được chia sẻ giữa khách hàng và WCF/BL .
  • Hợp đồng 'hợp đồng' này chứa tất cả DTO được gửi qua dây và đến WCF.
  • Chúng tôi đã định cấu hình proxy máy khách WCF để sử dụng lắp ráp hợp đồng (thay vì cho phép WCF tạo lại tất cả DTO) bằng cách đặt 'Loại tái sử dụng trong các cụm tham chiếu được chỉ định' trong Cài đặt tham chiếu dịch vụ.
  • Chúng tôi trang trí các DTO đó với thuộc tính DataAnnotations (và siêu dữ liệu khác).
  • Chúng tôi không trang trí các DTO đó với các thuộc tính WCF. WCF không cần chúng để tuần tự hóa DTO. Chúng là tùy chọn. Để chúng ra nếu bạn có thể. Nó chỉ cắt xén mã của bạn.
  • Vì khách hàng sử dụng cùng một cụm, chúng tôi có thể sử dụng DataAnnotations trên máy khách.
  • Chúng tôi cũng xác thực trên máy chủ.
  • Chúng tôi sử dụng AutoMapper để thực hiện hầu hết ánh xạ bản mẫu từ các thực thể đến DTO (nhưng không bao giờ là cách khác).
  • Thành thật mà nói, bạn thậm chí không để WCF tuần tự hóa DTO của chúng tôi, nhưng sử dụng JSON.NET và WCF chỉ cần gửi và nhận (plain text) JSON, bởi vì JSON.NET đơn giản hơn rất nhiều khi nói đến serialization và deserializing cấu trúc dữ liệu. Ví dụ, chúng tôi sử dụng JSON.NET để (de) serialize cấu trúc đối tượng bất biến. Hãy thử với WCF. Điều đó sẽ thất bại thảm hại.

Ngày đầu đó chúng tôi làm:

  • Việc sử dụng các lớp học Xem các mẫu để thêm chức năng cho khách hàng.
  • Thêm xác thực DataAnnotation tùy chỉnh trong hợp đồng hợp đồng để cho phép xác thực chạy trên cả máy khách và máy chủ.
  • Thêm IValidator<T> trừu tượng (của một số loại) để cho phép xác thực máy chủ hoặc máy khách cụ thể (bằng cách đặt triển khai trong lớp doanh nghiệp hoặc ứng dụng khách của bạn).
  • Lỗi xác thực cụ thể của máy chủ vận chuyển trở lại ứng dụng khách sử dụng ngoại lệ.
+0

cảm ơn bài đăng của bạn, nó rất thông tin. Về cơ bản tôi đã nghĩ đến việc tạo ra các lớp ViewModel DTO. Tự động hóa các lớp đó thành một lớp WCF và sau đó sử dụng Controller để chuyển lớp sang phương thức WCF để thêm/cập nhật/xóa. Có một lợi thế để đặt chúng trong một "hợp đồng" lắp ráp như bạn mô tả? Thay vì chỉ định nghĩa chúng trong WCF? – Will

+0

Nếu bạn không đặt chúng trong lắp ráp riêng của họ và chia sẻ rằng lắp ráp giữa máy chủ và khách hàng, nó có nghĩa là Visual Studio phải tạo ra một proxy khách hàng cho bạn và sẽ tái tạo DTO của bạn trên máy khách. Điều này không chỉ khiến bạn có thêm một đoạn mã (tạo ra), VS sẽ * không bao giờ * tái tạo bất kỳ thuộc tính nào (chẳng hạn như thuộc tính DataAnnotations) trên máy khách. Nói cách khác: bạn sẽ mất tất cả siêu dữ liệu bạn đã xác định trên các DTO đó. – Steven

2

Bạn vẫn có thể sử dụng Đối tượng của mình, nhưng tạo Mô hình chế độ xem và đặt chú thích dữ liệu của bạn trên những mục này. Có rất nhiều cuộc nói chuyện về nơi để đặt xác nhận trong một dự án. Nói chung nó hầu như luôn luôn là một cho rằng nó cần phải xảy ra tại giao diện người dùng và sau đó thường là ở nơi khác quá. Tôi muốn tránh cố gắng tập trung nó, vì điều này không bao giờ hoạt động (một kích thước hiếm khi phù hợp với tất cả).

Về chủ đề wedging một lớp WCF trong vòng giải pháp của bạn, trừ khi có lý do rất tốt cho nó, tôi sẽ tránh làm điều này bằng mọi giá. Tôi đã nhìn thấy loại điều này đi sai nhiều lần. Nó mang lại rất nhiều tác động tiêu cực. Trong hai trường hợp thương mại tôi đã xử lý, bạn kết thúc với quá nhiều điểm cuối và quá nhiều chattiness. Nó làm tê liệt việc có thể đưa logic nghiệp vụ vào thực thể của bạn và sử dụng những phương pháp này, bảo trì một cơn ác mộng và không đủ phần cứng và thiết kế cẩn thận, nếu được lưu trữ trên một máy chủ, bạn có thể phải sử dụng các đường ống được đặt tên có được tốc độ bạn cần, điều này phủ nhận bất kỳ lợi thế phân tán nào bạn có được từ việc sử dụng WCF.

Bạn sẽ tốt nhất để từ bỏ các tác vụ xử lý nặng như các thành phần mà bạn có thể lưu trữ ở nơi khác và giao tiếp thông qua giao diện nhỏ hơn, súc tích hơn. Trong thực tế, ngoài việc xử lý hình ảnh, các ứng dụng toán học và khoa học, xử lý dữ liệu nặng không tăng lên.

+0

Tôi cũng sẽ thêm rằng có một nguy cơ bảo mật trong việc trưng ra các lớp WCF như các mô hình MVC. – VsMaX

+1

Ý tưởng WCF ở giữa là MVC sẽ chỉ được sử dụng để trình bày. Khi các trường trên trang được cập nhật và lưu; lớp học sẽ được phổ biến và gửi đến WCF để được thao tác và lưu vào cơ sở dữ liệu. Bây giờ câu hỏi là nếu đó là một cách lý tưởng để làm điều đó. Chúng tôi muốn có mỗi dịch vụ chịu trách nhiệm cho một tập hợp các bảng trong cơ sở dữ liệu, vì vậy dữ liệu luôn luôn truyền qua các dịch vụ đó nếu được thêm/cập nhật/xóa. – Will

+0

@ Sẽ có âm thanh tốt, trong trường hợp tôi đã nhìn thấy các lớp WCF nội bộ gây ra vấn đề, nó luôn luôn là do lớp lộ như nhiều phương pháp như nó sẽ nếu nó chỉ là một hội đồng. Với việc chế tạo cẩn thận lớp WCF, theo lý thuyết nó có thể/nên hoạt động. Những gì bạn có thể kết thúc với là một lớp WCF mà trả về một tập hợp đầy đủ (gần như xem mô hình) của tất cả mọi thứ cần thiết để hiển thị một trang cụ thể trong một cuộc gọi duy nhất. Điều này sau đó sẽ làm cho nó dễ dàng để bolt trên một lớp trình bày ứng dụng điện thoại di động sau này. Tôi chỉ chú ý đến việc duy trì logic nghiệp vụ từ bất kỳ lớp nào trên lớp WCF. –

2

Chúng tôi sử dụng WCF theo cách bạn mô tả trong bài đăng của mình tại công ty hiện tại của tôi. Chúng tôi đã kết thúc việc có các lớp DTO cho WCF và MVC để giao tiếp với và sau đó ViewModels trong ứng dụng MVC để mô hình ràng buộc và xác thực trong giao diện người dùng.

Tôi đồng ý rằng có các lớp học gần như trùng lặp nhau và ánh xạ giữa chúng là một nỗi đau và dường như có vẻ sai ở một mức độ nào đó. Từ những gì tôi đã đọc trong quá khứ những gì chúng tôi đã làm, và những gì bạn có thể bị buộc phải làm, là thực hành tốt nhất.

Điều Adrian đề xuất ở trên liên quan đến việc chỉ xử lý nặng do WCF thực hiện cũng có ý nghĩa. Trước khi bắt đầu công việc hiện tại của tôi, tôi đã làm điều đó. Hầu hết logic nghiệp vụ được đặt trong một hội đồng lớp kinh doanh trực tiếp tham khảo bởi ứng dụng MVC. Đối với một vài quy trình chạy dài có khả năng, tôi đã tạo các dịch vụ WCF được lưu trữ riêng biệt mà ứng dụng MVC đã liên lạc.

Cuối cùng, bạn có thể sử dụng API Web và WCF không? Web API rất nhẹ và sử dụng HTTP với tất cả các chi phí đi kèm với các ràng buộc WCF, vv. Ngoài ra, với Web API, bạn có thể sử dụng cùng các lớp mà ứng dụng MVC đang sử dụng và thậm chí sử dụng xác thực mô hình trong API Web. Đây là điều tôi đang làm và ngày càng trở nên phổ biến hơn.

Hy vọng điều đó sẽ hữu ích!

+0

Cảm ơn bạn đã phản hồi. Việc ánh xạ các lớp trùng lặp có vẻ sai với tôi, nhưng giống như bạn đã nói nó có vẻ là thực hành tốt nhất. Tôi đã không nhận thức được WebAPI cho đến bây giờ. Thật không may, các dịch vụ của chúng tôi là các ràng buộc TCP, nhưng WebAPI có thể hữu ích đối với một số dự án khác của tôi. – Will

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