Wzorce projektowe – próbki wzorców MVC dla początkujących

Opublikowany: 2016-04-15

Wyjaśnia, co to jest wzorzec MVC i co to jest ASP.NET MVC Framework, jak to działa. Wyjaśnia również cykl życia strony ASP.NET MVC i funkcje ASP.NET MVC pod kątem wersji.

Przykłady zawierały mądre kroki, aby pomóc początkującym w łatwym zrozumieniu i osiągnięciu biegłości w ASP.NET MVC.

Jak wszyscy znamy wiele wzorców projektowych i wykorzystywania ich we wdrażaniu komponentów biznesowych i usług w naszych aplikacjach, nadal będziemy mierzyć się z problemami/wyzwaniami związanymi z naszymi aplikacjami. Również z dnia na dzień potrzeby i priorytety biznesowe będą się zmieniać. Jeśli uważnie obserwujemy szereg problemów, wad i wyzwań, przed którymi stoimy, to w warstwie interfejsu użytkownika i prezentacji. Chociaż niektóre defekty są związane z logiką biznesową i regułami biznesowymi, może być konieczne ich naprawienie w warstwach interfejsu użytkownika i prezentacji, ponieważ możemy ściśle zintegrować logikę biznesową w warstwach interfejsu użytkownika i prezentacji. Powodem tego jest to, że nie skupiliśmy się na wdrażaniu właściwych wzorców projektowych w naszych aplikacjach. Przejdźmy krok po kroku i zrozum, jak zaimplementować i wykorzystać wzór prezentacji w naszych aplikacjach.

Oświadczenie o problemie:
  1. Już używanie różnych wzorów w aplikacji, ale nadal utrzymanie aplikacji jest trudne.
  2. Używanie VS Test, NUnit, MUnit itp. do testowania warstwy logiki biznesowej, ale nadal istnieją pewne defekty w aplikacji jako logika biznesowa zaangażowana w warstwę prezentacji.
  3. Używano warstwy prezentacji, warstwy logiki biznesowej, warstwy dostępu do danych w aplikacji, ale nadal czasami trzeba napisać nadmiarowy kod w warstwie prezentacji, aby wykorzystać lub wywołać inne moduły lub inne przypadki użycia.
  4. Defekty integracji są wstrzykiwane, gdy wprowadzamy pewne zmiany w zintegrowanych modułach.
  5. Naprawianie defektów i ulepszenia zajmują więcej czasu na analizę logiki warstwy prezentacji i jej zależności integracyjnych oraz powodują otwieranie nowych defektów.
  6. Nie można wybrać ASP.NET MVC, ponieważ kompilacja interfejsu użytkownika jest skomplikowana.
Główna przyczyna problemu:

W warstwie Prezentacja,

  1. Strona lub formularz zawiera kontrolki wyświetlające dane domeny aplikacji. Użytkownik może modyfikować dane i zgłaszać zmiany. Strona pobiera dane domeny, obsługuje zdarzenia użytkownika, zmienia inne kontrolki na stronie w odpowiedzi na zdarzenia i przesyła zmienione dane domeny. Dołączanie kodu realizującego te funkcje do strony sieci Web Ponadto trudno jest udostępniać kod między stronami sieci Web, które wymagają tego samego zachowania. klasa złożona, trudna do utrzymania i trudna do przetestowania.
  2. Warstwa interfejsu użytkownika, logika interfejsu użytkownika, logika prezentacji i logika biznesowa są ze sobą ściśle powiązane.
  3. Warstwa prezentacji zajmuje się integracją modułów lub przypadków użycia.
Rozwiązanie:
  1. Wybierz najlepszy wzorzec warstwy prezentacji, aby oddzielić warstwę interfejsu użytkownika, logikę interfejsu użytkownika i logikę prezentacji oraz logikę biznesową jako oddzielne warstwy, aby ułatwić zrozumienie i utrzymanie kodu.
  2. Włącz luźne sprzężenie podczas opracowywania modułów lub dowolnych przypadków użycia.
  3. Zmaksymalizuj kod, który można przetestować za pomocą automatyzacji. (Widoki są trudne do przetestowania).
  4. Udostępniaj kod między stronami, które wymagają tego samego zachowania.
  5. Oddziel odpowiedzialność za wyświetlanie wizualne i zachowanie obsługi zdarzeń na różne klasy o nazwach odpowiednio widok i prezenter lub kontroler lub ViewModel.
Korzyści z używania wzorca prezentacji:
  1. Modułowość
  2. Podejście oparte na testach – zmaksymalizuj kod, który można przetestować za pomocą automatyzacji
  3. Separacja obaw
  4. Udostępnianie kodu między stronami i formularzami
  5. Łatwe w utrzymaniu

Jakie są dostępne wzory warstw prezentacji?

MVC (kontroler widoku modelu)

MVP (prezenter widoku modelu) lub (widok pasywny modelu, kontroler nadzorcy)

MVVM (Widok modelu ViewModel)

MVC vs MVP vs MVVM:
  1. Model i widok reprezentują to samo we wszystkich powyższych 3 wzorach?

    TAk

  2. Cel kontrolera, prezentera i ViewModel jest taki sam we wszystkich powyższych 3 wzorach?

    TAk

  3. Komunikacja i przepływ modelu, widoku z kontrolerem, prezentera i widoku modelu są takie same?

    Nie , to jest powód, dla którego te 3 wzorce istnieją.

  4. Czy te wzorce zastępują PL (warstwa prezentacji), BLL (warstwa logiki biznesowej) i DAL (warstwa dostępu do danych)

    Nie , te wzorce służą do oddzielania interfejsu użytkownika i logiki interfejsu użytkownika od logiki prezentacji i umożliwiają luźne sprzężenie.

Wybierz najlepszy wzór warstwy prezentacji:

MVP

  1. Wiązanie za pośrednictwem kontekstu danych nie jest możliwe
  2. Złożony projekt interfejsu użytkownika
  3. Najlepsze dla Windows Forms, ASP.NET Web Forms i aplikacji Sharepoint

MVC

  1. Najlepsze dla ASP.NET z prostym interfejsem użytkownika
  2. Model odłączony (widok oddzielony od wszystkich innych warstw)

Uwaga: tutaj nie skupiam się na MVC VM (MVC ViewModel z MVC3) i ASP.NET MVVM z Dependency Injection.

MVVM

  1. Możliwe jest powiązanie za pomocą kontekstu danych
  2. Podłączony model
  3. Najlepsze dla aplikacji WPF i Silverlight
Formularze internetowe ASP.NET a ASP.NET MVC:

Formularze internetowe ASP.NET

  1. RAD
  2. Łatwiejszy rozwój
  3. Bogaty ekosystem kontroli
  4. Znane jako podejście programistyczne do tworzenia formularzy Windows Forms
  5. Brak ViewState i brak obsługi ogłaszania zwrotnego

ASP.NET MVC

  1. Czysta separacja obaw (SoC)
  2. Pełna kontrola znaczników
  3. Włącz TDD (Test Driven Development)
  4. Włącz i ułatwia REST
  5. Łatwiejsza integracja po stronie klienta (Javascript)
  6. Multi View Engine (to jest naprawdę fajne!)
  7. Brak ViewState i brak obsługi ogłaszania zwrotnego
  8. Rozszerzalny i włączony WEB 2.0

Model, widoki i kontroler

  • Model : obiekty modelu to części aplikacji, które implementują logikę dla domeny danych aplikacji. Często obiekty modelu pobierają i przechowują stan modelu w bazie danych. Na przykład obiekt Product może pobierać informacje z bazy danych, operować na niej, a następnie zapisywać zaktualizowane informacje z powrotem w tabeli Products w programie SQL Server.
  • Widoki : widoki to składniki, które wyświetlają interfejs użytkownika (UI) aplikacji. Zazwyczaj ten interfejs użytkownika jest tworzony na podstawie danych modelu. Przykładem może być widok edycji tabeli Produkty, która wyświetla pola tekstowe, listy rozwijane i pola wyboru na podstawie bieżącego stanu obiektu Produkty.
  • Kontroler : Kontrolery to komponenty, które obsługują interakcję z użytkownikiem, pracują z modelem i ostatecznie wybierają widok do renderowania, który wyświetla interfejs użytkownika. W aplikacji MVC widok wyświetla tylko informacje; kontroler obsługuje i reaguje na dane wejściowe i interakcję użytkownika. Na przykład kontroler obsługuje wartości ciągu zapytania i przekazuje te wartości do modelu, który z kolei wysyła zapytania do bazy danych przy użyciu wartości.
Cykl życia strony wysokiego poziomu ASP.NET MVC?

ASP.NET MVC High Level Page Life Cycle

Cykl życia strony niskiego poziomu ASP.NET MVC?

ASP.NET MVC Low Level Page Life Cycle

Nowe funkcje MVC2.0

1. Szablony pomocników:

Pomocnicy szablonów pomagają nam automatycznie kojarzyć elementy HTML do edycji i wyświetlania z typami danych.

Np. gdy dane typu System.DateTime są wyświetlane w widoku, element interfejsu użytkownika datepicker może być renderowany automatycznie.

Jest to podobne do działania szablonów pól w danych dynamicznych ASP.NET.

2. Obszary:

Korzystanie z obszarów Możemy podzielić duży projekt na wiele mniejszych sekcji w celu zarządzania złożonością dużej aplikacji internetowej.

Każda sekcja („obszar”) zazwyczaj reprezentuje oddzielną sekcję dużej witryny sieci Web i służy do grupowania powiązanych zestawów kontrolerów i widoków.

Np

[xhtml]
Obszary
Admin
Kontrolery
Modele
Wyświetlenia
Roszczenia Iniala
Kontrolery
Modele
Wyświetlenia
[/xhtml]

3. Wsparcie dla kontrolerów asynchronicznych:

ASP.NET MVC2 umożliwia kontrolerom przetwarzanie żądań asynchronicznie.

Może to prowadzić do wzrostu wydajności, pozwalając serwerom, które często wywołują operacje blokujące (takie jak żądania sieciowe), na wywoływanie zamiast tego odpowiedników nieblokujących.

4. Obsługa DefaultValueAttribute w parametrach Action-Method:

Klasa System.ComponentModel.DefaultValueAttribute umożliwia podanie wartości domyślnej dla parametru argumentu do metody akcji.

Załóżmy na przykład, że zdefiniowana jest następująca trasa domyślna:

[kod]
{kontroler}/{akcja}/{id}
[/kod]

Załóżmy również, że zdefiniowano następujący kontroler i metodę akcji:

[kod]
public class Kontroler Artykułów
{
public ActionResult View (identyfikator int, [DefaultValue(1)]strona int)
{
}
}
[/kod]

Każdy z następujących adresów URL żądań wywoła metodę akcji View, która jest zdefiniowana w poprzednim przykładzie.

  • /Artykuł/Widok/123
  • /Article/View/123?page=1 (w praktyce tak samo jak w poprzednim żądaniu)
  • /Artykuł/Widok/123?page=2
5. Obsługa wiązania danych binarnych z modelami binderów:

Istnieją dwa nowe przeciążenia pomocnika Html.Hidden , który koduje wartości binarne jako ciągi zakodowane algorytmem base-64:

[kod]
public statyczny ciąg Hidden (ten HtmlHelper htmlHelper, nazwa ciągu, wartość binarna);
public statyczny ciąg Hidden (ten HtmlHelper htmlHelper, nazwa ciągu, wartość byte[]);
[/kod]

6. Obsługa atrybutów DataAnnotations :

Używanie atrybutów walidacji RangeAttribute , RequiredAttribute , StringLengthAttribute i RegexAttribute (zdefiniowanych w przestrzeni nazw System.ComponentModel.DataAnnotations ), gdy łączymy się z modelem w celu zapewnienia walidacji danych wejściowych.

[kod]
za pomocą System.ComponentModel.DataAnnotations;
przestrzeń nazw MvcTmpHlprs
{
[MetadataType(typeof(ProductMD))]
public częściowa klasa Produkt
{
klasa publiczna ProductMD
{
obiekt publiczny SellStartDate { get; ustawić; }
[UIHint("rbData")]
obiekt publiczny SellEndDate { get; ustawić; }
[TypDanych(TypDanych.Data)]
obiekt publiczny DiscontinuedDate { get; ustawić; }
[Kolumna Rusztowania (fałsz)]
obiekt publiczny Data modyfikacji { get; ustawić; }
[Kolumna Rusztowania (fałsz)]
wierszguid obiektu publicznego { get; ustawić; }
[Kolumna Rusztowania (fałsz)]
obiekt publiczny ThumbnailPhotoFileName { get; ustawić; }
}
}
}
[/kod]

7. Dostawcy walidatorów modeli:

Klasa dostawcy walidacji modelu reprezentuje abstrakcję, która zapewnia logikę walidacji dla modelu.

ASP.NET MVC zawiera domyślnego dostawcę opartego na atrybutach walidacji, które są zawarte w przestrzeni nazw System.ComponentModel.DataAnnotations .

8. Walidacja po stronie klienta:

Klasa dostawcy walidatora modelu udostępnia w przeglądarce metadane walidacji w postaci danych serializowanych w formacie JSON, które mogą być używane przez bibliotekę walidacji po stronie klienta.

ASP.NET MVC 2 zawiera bibliotekę walidacji klienta i adapter, który obsługuje wymienione wcześniej atrybuty walidacji przestrzeni nazw DataAnnotations .

9. Nowy filtr akcji RequireHttpsAttribute :

ASP.NET MVC 2 zawiera nową klasę RequireHttpsAttribute , którą można zastosować do metod akcji i kontrolerów.

Domyślnie filtr przekierowuje żądanie inne niż SSL (HTTP) do odpowiednika z włączonym SSL (HTTPS).

10. Zastępowanie czasownika metody HTTP:

Gdy tworzymy witrynę internetową przy użyciu stylu architektonicznego REST, czasowniki HTTP są używane do określenia, którą akcję wykonać dla zasobu.

REST wymaga, aby aplikacje obsługiwały pełen zakres popularnych czasowników HTTP, w tym GET , PUT , POST i DELETE .

ASP.NET MVC 2 zawiera nowe atrybuty, które możemy zastosować do metod akcji i które mają kompaktową składnię.

Te atrybuty umożliwiają ASP.NET MVC wybranie metody akcji na podstawie zlecenia HTTP.

Na przykład żądanie POST wywoła pierwszą metodę działania, a żądanie PUT wywoła drugą metodę działania.

[kod]
[HttpPost]
public ActionResult Edytuj (identyfikator int)

[HttpPut]
public ActionResult Edit (identyfikator int, tag tag)
[/kod]

We wcześniejszych wersjach ASP.NET MVC te metody akcji wymagały bardziej szczegółowej składni, jak pokazano w poniższym przykładzie:

[kod]
[Zaakceptuj czasowniki (HttpVerbs.Post)]
public ActionResult Edytuj (identyfikator int)

[Zaakceptuj czasowniki(HttpVerbs.Put)]
public ActionResult Edit (identyfikator int, tag tag)
[/kod]

Ponieważ przeglądarki obsługują tylko czasowniki HTTP GET i POST , nie można wysyłać wiadomości do akcji, która wymaga innego czasownika. W związku z tym nie jest możliwa natywna obsługa wszystkich żądań RESTful z REST.

Jednak w celu obsługi żądań RESTful podczas operacji POST ASP.NET MVC 2 wprowadza nową metodę pomocnika HTML HttpMethodOverride .

Ta metoda renderuje ukryty element wejściowy, który powoduje, że formularz skutecznie emuluje dowolną metodę HTTP.

Na przykład, używając metody pomocnika HTML HttpMethodOverride , możemy sprawić, że przesłanie formularza będzie wyglądać jak żądanie PUT lub DELETE .

Zachowanie HttpMethodOverride wpływa na następujące atrybuty:

  • HttpPostAttribute
  • HttpPutAttribute
  • HttpGetAttribute
  • HttpDeleteAttribute
  • AcceptVerbsAttribute
11. Nowa klasa HiddenInputAttribute dla pomocników szablonów:

Możemy zastosować nowy atrybut HiddenInputAttribute do właściwości modelu, aby wskazać, czy ukryty element wejściowy powinien być renderowany podczas wyświetlania modelu w szablonie edytora (atrybut ustawia niejawną wartość UIHint HiddenInput ).

Właściwość DisplayValue atrybutu pozwala określić, czy wartość ma być wyświetlana w trybach edytora i wyświetlania.

Gdy DisplayValue ma wartość false, nic nie jest wyświetlane, nawet znacznik HTML, który normalnie otacza pole.

Wartość domyślna DisplayValue to prawda.

Możemy użyć atrybutu HiddenInputAttribute w następujących scenariuszach:

  • Gdy widok umożliwia użytkownikom edycję identyfikatora obiektu i konieczne jest wyświetlenie wartości, a także podanie ukrytego elementu wejściowego zawierającego stary identyfikator, aby można go było przekazać z powrotem do kontrolera.
  • Gdy widok pozwala użytkownikom edytować właściwość binarną, która nigdy nie powinna być wyświetlana, na przykład właściwość sygnatury czasowej.

W takim przypadku wartość i otaczające ją znaczniki HTML (takie jak etykieta i wartość) nie są wyświetlane.

Np:

[kod]
public class ProductViewModel
{
[HiddenInput] // odpowiednik [HiddenInput(DisplayValue=true)]
public int Id { get; ustawić; }

ciąg publiczny Nazwa { get; ustawić; }

[Hidden Input(DisplayValue=false)]
public byte[] TimeStamp { get; ustawić; }
}
[/kod]

12. Metoda pomocnicza Html.ValidationSummary może wyświetlać błędy na poziomie modelu:

Zamiast zawsze wyświetlać wszystkie błędy walidacji, metoda pomocnika Html.ValidationSummary ma nową opcję wyświetlania tylko błędów na poziomie modelu.

Umożliwia to wyświetlanie błędów na poziomie modelu w podsumowaniu walidacji oraz błędów specyficznych dla pól obok każdego pola.

13. Szablony T4 w Visual Studio Wygeneruj kod, który jest specyficzny dla docelowej wersji .NET Framework:

Nowa właściwość jest dostępna dla plików T4 z hosta ASP.NET MVC T4, która określa wersję .NET Framework, która jest używana przez aplikację.

Dzięki temu szablony T4 mogą generować kod i znaczniki specyficzne dla wersji .NET Framework.

W programie Visual Studio 2008 wartością jest zawsze .NET 3.5. W programie Visual Studio 2010 wartością jest .NET 3.5 lub .NET4.

14. Ulepszenia API:

Dodano chronioną wirtualną metodę CreateActionInvoker w klasie Controller.

Ta metoda jest wywoływana przez właściwość ActionInvoker kontrolera i umożliwia leniwe tworzenie instancji wywołującego, jeśli nie ustawiono jeszcze żadnego wywołującego.