2010-01-25 22 views
5

Próbuję dowiedzieć się, co dałoby mi najpiękniejszy kod. Co oczywiście jest trochę subiektywne, zdaję sobie sprawę.Do nieruchomości, czy nie do nieruchomości?

Mam aplikacji, która korzysta z bazy danych, dla których napisałem zespół, który ukrywa szczegóły na temat tej bazy danych z wszystkich aplikacji, które korzystają z tego zgromadzenia.

Mam również aplikację WPF, która korzysta z tego zestawu do wyświetlania różnych kalkulacji kosztów, w których chciałbym użyć wiązania danych.

Databinding jest możliwy tylko do właściwości obiektów (o ile mam do pracy). Oznaczałoby to, że potrzebowałbym obiektu, najlepiej z obsługą INOTify i szerokim zakresem obiektów. Wolałbym jednak przechowywać INotify i WPF poza zespołem, który obsługuje dostęp do bazy danych.

W jaki sposób inni rozwiązują ten problem: Przechowuj elementy WPF poza warstwą bazy danych (np. INotify) i wewnątrz WPF zezwalaj na wiązanie? Napisz opakowanie? Czy też większość osób umieszcza klasę "własność"/"INotify" jako obiekt przesyłania danych bezpośrednio w warstwie bazy danych?

Odpowiedz

3

Pracujesz pod błędnym przekonaniem. INotifyPropertyChanged to nie rzecz WPF. Rozważmy:

  1. Jest częścią System.dll
  2. Jest w przestrzeni nazw System.ComponentModel
  3. Został on częścią w NET Framework od wersji 2.0
  4. Jest on obsługiwany przez większość NET obiektów danych ramowa spośród pudełko zawierające ADO.NET DataRowView i ObservableCollection ComponentModel.
  5. Jest to automatycznie używane przez WinForms, ASP.NET, WPF i wiele pakietów zewnętrznych do łączenia się z obiektami danych.

Ponieważ wszystkie automatycznie generowane warstwy danych Microsoft produkuje narzędzie INotifyPropertyChanged, dlaczego warto traktować warstwę danych w inny sposób?Oczywiście twoja warstwa danych musi powiadamiać swoich klientów w jakiś sposób, gdy zmieniają się właściwości. Dlaczego nie skorzystać z wbudowanego mechanizmu NET Framework?

Moim zdaniem każda warstwa danych zawierająca zmienne obiekty powinna zaimplementować powiadomienia o zmianie właściwości w postaci oczywiście. INotifyPropertyChanged został zaprojektowany jako mechanizm powiadamiania, więc dlaczego nie używać go tak, jak zamierzano?

Bardziej ogólna uwaga: dodanie dodatkowej warstwy owijki jest zwykle nieefektywnym nadymaniem kodu. Czasami jest to konieczne, a nawet korzystne, ale nie rób tego tylko ze względu na to. Wiele razy rozsądnie zaprojektowane obiekty warstwy danych działają bardzo dobrze jako modele widoku. Tylko w przypadku, gdy model widoku różni się od warstwy danych lub gdy potrzebujesz dodatkowej funkcjonalności, należy rozważyć wprowadzenie dodatkowej złożoności, a następnie tylko indywidualnie dla każdego przypadku.

1

Myślę, że najczystszym rozwiązaniem jest napisanie obiektu opakowującego w zestawie WPF i zachowanie typów INotify poza zestawem bazy danych. Nie ma powodu, aby dodać komplikację z warstwy INotify do warstwy bazy danych, chyba że zapewnia ona określoną przewagę.

7

Inne osoby rozwiązują ten problem, wdrażając wzór projektu MVVM.

0

Napisz opakowanie. Jeśli owijanie jest całkiem proste, można nawet zbudować generator generujący wszystkie klasy na podstawie źródła DTO:

0

Możesz zajrzeć do PostSharp, to jest właśnie to, do czego służy programowanie zorientowane na aspekt (AOP). W klasach modeli jest dużo examples tkania INotify *. Nie zacząłem używać PostSharp na prawdziwym projekcie, ale wygląda to obiecująco w niektórych scenariuszach testowych, które wypróbowaliśmy.

0

Jeszcze jedno, aby pamiętać, że jest przydatny - jeśli wiesz, że właściwość wiązania się pan jest niezmienna (tj pojedyncza przedmiot lub coś, co będzie można zainicjować raz i nigdy nie dotknął), to nie potrzeba zrobić INotifyPropertyChanged - prosta właściwość zadziała dobrze.

Powiązane problemy