2014-12-03 4 views
6

Używam ASP.Net Web API i Code First Entity Framework iz tego, co przeczytałem, zazwyczaj ujawniasz obiekty DTO, a nie obiekty encji bezpośrednio w twoich metodach działania (zgodnie z http://www.asp.net/web-api/overview/data/using-web-api-with-entity-framework/part-5).Atrybuty sprawdzania poprawności ASP.Net Web API na DTO?

Tak więc w jednym przypadku nad którym pracuję, aby uniknąć problemu "over-posting", jak opisano w powyższym linku, utworzyłem obiekt DTO z niemal wszystkimi właściwościami, co obiekt modelu. Zastanawiam się jednak, czy muszę duplikować wszystkie te same zestawy atrybutów sprawdzania poprawności (np. [Wymagane], [Zakres (N, M)] ​​itp. Zarówno dla właściwości DTO, jak i modelu? Początkowo miałem nadzieję, że nie do (w celu uniknięcia powielania), ale potrzebujesz atrybutów sprawdzania poprawności w DTO, jeśli chcesz skorzystać z walidacji wiążącej (np. ModelState.IsValid) i na modelu głównym, jeśli chcesz utworzyć bazę danych z odpowiednimi ograniczeniami ([Wymagane ] -> nie null, itd.)

Czy nie ma lepszego sposobu

Ponadto, istnieją pewne cechy, które używa Entity ale walidacja wiążący model nie używają Na przykład, gdy [Range (n? , m)] będzie wyraźnie wpływać na walidację na niektórych danych wejściowych klienta, czy podmiot w ogóle o to dba (nie ma wpływu na utworzony DB schemat z tego, co mogę powiedzieć?)

Odpowiedz

6

Podmioty powinny mieć tylko te atrybuty, które rzeczywiście mają wpływ na bazę danych. DTO nie powinny mieć żadnych atrybutów do sprawdzania poprawności, z wyjątkiem obiektu DataMemberAttribute w celu zdefiniowania, czy właściwość jest wymagana i w jakiej kolejności powinna być wyświetlana itd. W przypadku OData należy również ustawić wartość KeyAttribute. Modele powinny mieć atrybuty sprawdzania poprawności. Ponieważ DTO i modele są prawdopodobnie prawie identyczne, które tworzysz dla każdego dto, który wymaga sprawdzenia poprawności modelu i po prostu zamienia wartość dto na obiekt modelu. Teraz można go zatwierdzić, jeśli nie używasz ValidationAttributes dla modeli można potwierdzić je na przykład z FluentValidation

Więc krótko mówiąc:

  • Podmioty dostać tylko atrybuty, które faktycznie mają wpływ schematu bazy danych za

  • DTOs są proste obiekty bez logiki walidacji, z wyjątkiem DataMemberAttribute

  • modele powinny mieć sprawdzania poprawności atrybutów (onl y w razie potrzeby, nie potrzebne przy korzystaniu FluentValidation)

Workflow dla POST będą: -> DTO przychodzi -> Zmienne dto od modelu -> walidacji modelu -> Model swap do podmiotu -> Store podmiot w bazie danych -> Użyj zaktualizowaną podmiot i zamienić go na nowy DTO -> Zwraca Dto

Pozdrowienia, Voltaic

+4

„swap dto do modelu” następnie Weryfikacja modelu, jak będzie to działa? Z zamianą Myślę, że masz na myśli map dto do modelu? Jeśli tak, ModelState nadal będzie działał na dto, ponieważ ten został przekazany. Krótka historia: Czy umieściłeś Wymagany atrybut na swoim DTO? – Elisabeth

+0

Możesz odwzorować DTO na model za pomocą AutoMappera lub dowolnej innej platformy, lub po prostu zrobić to ręcznie. Wymagany atrybut służy do zapewnienia stanu dto, z którym chcesz poradzić sobie. Model nie potrzebuje wymaganego atrybutu, tylko DTO. Możesz napisać klasę podstawową dla swoich modeli, która posiada DTO jako pewien stan i możesz wtedy po prostu pokazać właściwości DTO jako właściwości modelu. – Voltaic

+0

Jeśli tak, to jaka jest strategia przesyłania informacji o modelu bazowym do klienta? Jeśli pole jest nieprawidłowe, dobrze byłoby wiedzieć, nie trafiając na serwer. Twierdziłbym, że jeśli dto jest używane w operacji aktualizacji, to umieszczanie walidacji lub innej logiki biznesowej w dto, aby klient mógł z góry wiedzieć, jak sformułować żądanie. – Watson