2012-04-03 15 views
7

Wkrótce opracujemy aplikację dla dużych przedsiębiorstw i spędziłem trochę czasu na badaniu WPF + PRISM + MVVM, mam dobre pojęcie o większość pojęć i kocham modułowość, którą zapewnia.WPF WCF Prism i MVVM - poprawny sposób na ujawnienie obiektów

Tam, gdzie mam problemy, jest to, jak zaprojektować warstwę usług, aby uzyskać dostęp do danych i wyjść, szczególnie gdy ta usługa jest wprowadzana przez moduł z myślą, że moduł zależny może z niego korzystać.

Chciałem wyodrębnić moje usługi danych WCF w ramach usług aplikacji i użyć ServiceLocator do rozwiązania konkretnych wystąpień z moich modeli widoków, jednak mam ciężko pracować nad tym, jak to powinno się trzymać razem, głównie ze względu na moje intencje część usługi WCF.

Na przykład

Module1 Zawiera usługi WCF + Service Zastosowanie Beton (ISearchService) + WCF usługi generowane podmiotów (modelu)

Module1.Infastructure - Zawiera następujący interfejs dla usługi aplikacji

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

byłby zarejestrowany w UnityContainer tak, że każdy inny moduł może uzyskać konkretną implementację wprowadzoną przez moduł.

Mój problem polega na tym, że Entity (Person) są zdefiniowane w samym module (w usłudze WCF), więc wprowadzenie usługi i oczekiwanie, że inne moduły będą w stanie z niej skorzystać, oznacza, że ​​muszą odwoływać się do samego modułu nie tylko infrastruktury modułowej, chyba że wyciągnę usługi do innego zespołu.

Czy powinienem ujawniać moje obiekty, które są automatycznie generowane z mojego modelu EF w ten sposób?

Czy ktoś ma lepsze rozwiązanie?

+0

Być może zainteresuje mnie to moje pytanie (http://stackoverflow.com/q/4824058/302677) o tym, czy usługa WCF powinna zwrócić obiekty 'Model' lub obiekt przesyłania danych. Skończyło się na tym, że skorzystałem z DTO i okazało się, że znacznie łatwiej jest mu zwrócić obiekt do przesyłania danych i użyć czegoś takiego jak [AutoMapper] (http://automapper.codeplex.com/) w celu zamapowania "DTO" na "Modele" i vice versa – Rachel

+0

Podoba mi się ten pomysł, czy użycie POCO w Entity Framework byłoby zasadniczo tym samym? –

Odpowiedz

1

Oto jak to się stało.

Aktualnie korzystam z usług Silverlight + PRISM + MVVM + WCF (RIA).

Przy obecnej architektury projektu

  • Application.Domain: Zawierający cały kod EF pierwsze podmioty w tym metadanych i walidacji biznesowej. Nie obejmuje generowania bazy danych.
  • Application.RIAServices: Jest to projekt, który zawiera wygenerowane automatycznie klasy z projektu WWW usług WCF RIA. Mogę odwołać się do tego projektu w obu WPF i Silverlight.

  • Aplikacja.RIAServices.Web: Projekt WWW zawierający DomainServices i kod generowania bazy danych za pomocą DbContext. jest to projekt połączenia RIA WCF dla aplikacji.RIAServices

  • Aplikacja.Infrastruktura: Tutaj zaczyna się. Ponieważ tak jak Ty, mam Person/Customer Service za pomocą interfejsu ICustomerService. Ponieważ chcę korzystać z tej usługi na przykład w całej aplikacji, a nie tylko w module A, umieszczam ten interfejs w infrastrukturze. Wszystkie projekty zawierają odniesienie do tego projektu.

  • Application.Modules.ModuleA -> Application.Modules.ModuleD: Ogólne moduły zapewniające funkcjonalność. Wszystkie moje moduły (korzystające z usług WCF RIA) mają odniesienie do projektów Application.Infrastructure i Application.RIAServices.

  • Application.Shell: Projekt uruchomienia. posiadanie bootstrapera i rejestrowanie wszystkich odpowiednich modułów.

Pytanie z Rachel sprawiło, że pomyślałem o pewnych rzeczach i po prostu chciałem zostawić moją strukturę na temat tego, jak to zrobiłem. Możesz mieć pomysł na ten temat. Nie chcę jeszcze przejść do DTO, ponieważ rzeczy takie jak sprawdzanie poprawności są tak dobrze zintegrowane z usługami WCF RIA, które automatycznie odzwierciedlają w polu tekstowym, gdy coś jest nie tak i wyświetla komunikat o błędzie. Czekamy na Twoją opinię i wyniki na pytanie/problem

Edit:

Application.Domain posiada również oddzielną strukturę również.

Mam swoje modele. Tylko czyste właściwości kontenera, które należy zmapować do bazy danych. Następnie mam mój folder metadanych. Aby to zadziałało, potrzebuję tej samej przestrzeni nazw co moja Jednostka i sprawię, że podmiot będzie częściowy. Tworzę plik Entity.metadata.cs i tam utworzę internal sealed class EntityMetaData, Kopiowanie właściwości i dodawanie do nich atrybutów. Używając atrybutu MetadataType powyżej klasy Jednostka dodaje wszystkie te atrybuty do generatora kodu RIA EF/WCF.

Jednym z tych atrybutów jest CustomValidation używa klasy statycznej i parametru metody oraz sprawdza poprawność encji na serwerze. Lub jeśli utworzysz plik z rozszerzeniem .shared.cs, zostanie wygenerowany do projektu Application.RIAServices.

Możliwość

Aby spróbować odpowiedzieć na to pytanie, może mieć tylko 1 opcję i to jest to, co zaproponował w pierwszej kolejności. Możesz utworzyć projekt Customer.Infrastructure.

Ten projekt zawiera interfejs dla ICustomerService, Entity/DTO/POCO, czegokolwiek potrzebujesz, a może nawet wdrożenie tej usługi ICustomerService lub WCF. Dzięki temu wszystkie moduły mogą odwoływać się do tego projektu, a tym samym nie tworzyć zależności między modułami.

+0

Każdy znaleziony zasób stwierdza, że ​​usługi RIA nie są obsługiwane w WPF, czy tak nie jest? –

+0

Chcę ograniczyć moje usługi, tak aby zajmowały się tylko podmiotami, które są istotne dla modułu, mimo że mogą lub nie mogą współdzielić tej samej bazy danych, mój problem polega na tym, że w efekcie otrzymuję EF POCOS - moje wygenerowane usługi, które nie są naprawdę chce się wyeksponować, to może inny DTO - to po prostu bałagan z każdą jednostką reprezentowaną kilkanaście razy. –

+0

@RichardFriend Muszę na to popatrzeć. Mogę odwołać się do projektu, stworzyć referencję i stworzyć kontekst klienta. Ale nie widziałem go w czasie wykonywania. Spojrzę na to. W przypadku Twojego problemu może istnieć sposób ograniczenia kontenera do rozwiązania instancji. Również będzie wyglądać –

0

Możesz zdefiniować interfejs IPerson, twój podmiot go wdrożyć (używając klas cząstkowych) i użyć go w umowie. Inną opcją, jeśli wolisz, jest podzielenie definicji jednostek na własny zbiór lub po prostu uwzględnienie ich w zestawie umów.

+0

Pomyślałem o tym i podoba mi się ten pomysł, jednak jest to ogromna praca nad stworzeniem tych interfejsów i utrzymanie ich w synchronizacji z modelem danych, jeśli wziąć pod uwagę, że podmioty są generowane automatycznie. Ciekawe, jak inni ludzie podejdź do tego. –

+0

Nie możesz automatycznie wygenerować interfejsu?Przynajmniej jako punkt wyjścia, który zaoszczędziłby Ci wiele pisania. –

+0

co z tworzeniem nowych jednostek, musiałbym zarejestrować konkretny byt na jego interfejsie i użyć 'ServiceLocator' lub pojemnika jedności do rozwiązania, to po prostu wydaje się nie tak .. –

Powiązane problemy