2012-04-03 20 views
7

Chúng tôi sẽ phát triển một ứng dụng máy tính để bàn doanh nghiệp lớn rất sớm và tôi đã dành một chút thời gian nghiên cứu cách tiếp cận WPF + PRISM + MVVM, tôi đã nắm bắt tốt hầu hết các khái niệm và yêu thích mô đun mà nó cung cấp.WPF WCF lăng kính và MVVM - cách chính xác để lộ thực thể

Trường hợp tôi đang gặp vấn đề là làm thế nào để kiến ​​trúc lớp dịch vụ để lấy dữ liệu vào và ra, đặc biệt khi dịch vụ này được mô-đun giới thiệu với ý tưởng mô-đun phụ thuộc có thể sử dụng nó.

Tôi muốn trừu tượng các dịch vụ dữ liệu WCF của tôi bên trong các dịch vụ ứng dụng và sử dụng ServiceLocator để giải quyết các trường hợp cụ thể từ bên trong các mô hình xem của mình, tuy nhiên, có một thời gian khó khăn. một phần của dịch vụ WCF.

Ví dụ

Module1 Có WCF Service + bê tông Dịch vụ ứng dụng (ISearchService) + Dịch vụ WCF tạo ra các thực thể (mô hình)

Module1.Infastructure - Chứa các giao diện sau cho các dịch vụ ứng dụng

public interface ISearchService 
{ 
     ObservableCollection<Person> Search(string search); 
} 

điều này sẽ được đăng ký trong UnityContainer để bất kỳ mô-đun nào khác có thể có được sự thực thi cụ thể được mô tả bởi mô-đun.

Vấn đề của tôi là các thực thể (Person) được xác định trong chính mô-đun (trong dịch vụ WCF), do đó giới thiệu một dịch vụ và sau đó mong đợi bất kỳ mô-đun nào khác có thể sử dụng nó. không chỉ cơ sở hạ tầng mô-đun, trừ khi tôi rút các dịch vụ sang một hội đồng khác.

Tôi có nên để lộ các đơn vị được tạo tự động từ mô hình EF theo cách này không?

Có ai có giải pháp tốt hơn không?

+0

Bạn có thể quan tâm [câu hỏi này của tôi] (http://stackoverflow.com/q/4824058/302677) về nếu dịch vụ WCF phải trả về các đối tượng 'Mô hình' hoặc đối tượng truyền dữ liệu. Tôi đã kết thúc với một DTO, và tìm thấy nó dễ dàng hơn nhiều để có nó trở lại một đối tượng truyền dữ liệu và sử dụng một cái gì đó như [AutoMapper] (http://automapper.codeplex.com/) để ánh xạ 'DTOs' đến' Models' và ngược lại – Rachel

+0

Tôi thích ý tưởng đó, việc sử dụng POCO trong khung Entity về cơ bản có giống nhau không? –

Trả lời

1

Đây là cách thực hiện.

Tôi hiện đang sử dụng dịch vụ Silverlight + PRISM + MVVM + WCF (RIA).

Với kiến ​​trúc dự án hiện tại

  • Application.Domain: Chứa tất cả các mã EF tổ chức đầu tiên bao gồm siêu dữ liệu và xác nhận kinh doanh. Không bao gồm việc tạo cơ sở dữ liệu.
  • Application.RIAServices: Đây là dự án có chứa các lớp được tạo tự động từ dự án web dịch vụ WCF RIA. Tôi có thể tham khảo dự án này trong cả WPF và Silverlight.

  • Application.RIAServices.Web: Webproject chứa DomainServices và mã tạo cơ sở dữ liệu bằng cách sử dụng DbContext. đây là dự án liên kết WCF RIA cho ứng dụng.RIAServices

  • Application.Infrastructure: Đây là nơi bắt đầu. Bởi vì cũng giống như bạn tôi có một người/dịch vụ khách hàng bằng cách sử dụng một giao diện ICustomerService. Bởi vì tôi muốn sử dụng dịch vụ này cho ứng dụng ví dụ rộng và không chỉ trong ModuleA, tôi đặt giao diện này trong Cơ sở hạ tầng. Tất cả các dự án đều có tham chiếu đến dự án này.

  • Application.Modules.ModuleA -> Application.Modules.ModuleD: Mô-đun chung cung cấp chức năng. Tất cả các mô-đun của tôi (sử dụng WCF RIA Services) đều có tham chiếu đến các dự án Application.Infrastructure và Application.RIAServices.

  • Application.Shell: Dự án khởi động. có bootstrapper và đăng ký tất cả các mô-đun liên quan.

Đọc câu hỏi Rachels khiến tôi suy nghĩ về những điều nhất định và tôi chỉ muốn để lại cấu trúc của mình về cách tôi đã làm. Bạn có thể có một ý tưởng về nó. Tôi không muốn đi đến DTO được nêu ra bởi vì những thứ như xác nhận là rất tốt intregrated trong WCF RIA dịch vụ mà nó tự động phản ánh trong hộp văn bản khi có điều gì đó sai và hiển thị một thông báo lỗi. Mong muốn được nghe ý kiến ​​của bạn và kết quả của câu hỏi/vấn đề

Edit:

Application.Domain cũng có một cấu trúc là tốt riêng biệt.

Tôi có Mô hình của mình. Chỉ chứa các thuộc tính thuần túy cần được ánh xạ tới cơ sở dữ liệu. Sau đó, tôi có thư mục Siêu dữ liệu của mình. Bây giờ cho công việc này tôi cần phải có cùng một không gian tên như thực thể của tôi và tôi làm cho các thực thể một phần. Tôi tạo ra một tập tin Entity.metadata.cs và trong đó tôi tạo ra một internal sealed class EntityMetaData, Sao chép các thuộc tính và thêm các thuộc tính cho nó. Bằng cách sử dụng thuộc tính MetadataType phía trên lớp Entity, nó thêm tất cả các thuộc tính đó vào trình tạo mã RIA EF/WCF.

Một trong những thuộc tính đó là CustomValidation, sử dụng lớp tĩnh và tham số phương thức và xác thực pháp nhân trên máy chủ. Hoặc nếu bạn tạo tệp có đuôi .shared.cs, nó sẽ được tạo ra cho dự án Application.RIAServices.

Khả

Để cố gắng trả lời câu hỏi của bạn, bạn có thể chỉ có 1 lựa chọn và đó là những gì bạn đề nghị ban đầu. Bạn có thể tạo một dự án Customer.Infrastructure.

dự án này chứa giao diện cho ICustomerService, thực thể/DTO/POCO bạn muốn gì và thậm chí có thể triển khai ICustomerService này hoặc dịch vụ WCF. Điều này sau đó cho phép tất cả các mô-đun của bạn tham khảo dự án này và do đó không tạo ra sự phụ thuộc giữa các mô-đun.

+0

mọi tài nguyên tôi đã thấy rằng các dịch vụ RIA không được hỗ trợ trong WPF, đây có phải là trường hợp không? –

+0

Tôi muốn hạn chế dịch vụ của mình để họ chỉ đối phó với các thực thể có liên quan đến mô-đun, mặc dù họ có thể hoặc không chia sẻ cùng một cơ sở dữ liệu, vấn đề của tôi là tôi kết thúc với EF POCOS của tôi thực sự muốn phơi bày, sau đó có thể một DTO khác - nó chỉ là một mớ hỗn độn với mỗi thực thể đại diện cho nhiều lần .. –

+0

@RichardFriend Tôi cần phải nhìn vào điều đó. Tôi có thể tham khảo dự án tạo một tham chiếu và tạo một customercontext. Nhưng tôi đã không nhìn thấy nó trong thời gian chạy. Tôi sẽ có một cái nhìn. Về vấn đề của bạn có thể có một cách để hạn chế các container để giải quyết dụ. Cũng sẽ có một cái nhìn –

0

Bạn có thể xác định giao diện IPerson, yêu cầu thực thể của bạn triển khai (sử dụng các lớp một phần) và sử dụng trong hợp đồng của bạn. Một lựa chọn khác, nếu bạn thích, là tách các định nghĩa thực thể của bạn thành một assembly riêng của chúng, hoặc chỉ bao gồm chúng trong assembly hợp đồng của bạn.

+0

Tôi đã nghĩ về điều đó, và tôi thích ý tưởng này, tuy nhiên rất nhiều công việc để tạo ra các giao diện này và giữ chúng đồng bộ với mô hình dữ liệu, khi bạn xem xét các thực thể được tạo tự động. tiếp cận điều này. –

+0

Bạn cũng không thể tự động tạo giao diện?Ít nhất là một điểm khởi đầu mà sẽ giúp bạn tiết kiệm rất nhiều đánh máy. –

+0

Điều gì về việc tạo ra các thực thể mới, tôi sẽ phải đăng ký thực thể cụ thể đối với giao diện của nó và sử dụng 'ServiceLocator' hoặc container thống nhất để giải quyết, điều này chỉ cảm thấy sai .. –

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