SlideShare uma empresa Scribd logo
1 de 64
Wzorce projektowe
w ASP.NET
Bartłomiej Zass
Microsoft
 Keep It Simple Stupid (KISS)
 Don’t Repeat Yourself (DRY)
 Tell, Don’t Ask (reguła Hollywood)
 Wydajemy polecenie obiektom, zamiast pytać o ich stan i wykonywać akcję
 You Ain’t Gonna Need It (YAGNI) – tylko to, co niezbędne
 Separation of Concerns (SoC)
Główne zasady
 Single Responsibility Principle (SRP)
 Nie monolityczna konstrukcja (scyzoryk), 1 powód do zmiany stanu
 Open-Closed Principle (OCP)
 Klasy powinny być otwarte na rozszerzenia, ale zamknięte na zmiany
(brak problemów podczas modyfikacji klas bazowych)
 Liskov Substitution Principle (LSP)
 Możliwość podmienienia każdej dziedziczącej klasy z klasą bazową, bez wpływu na działanie
 Interface Segregation Principle (ISP)
 Grupowanie interfejsu na mniejsze
 Dependency Inversion Principle (DIP)
 Zależność od abstrakcji, nie konkretnej implementacji
 Inversion of Control (IoC) – kontener / framework wstrzykujący konkretną implementację (odwrócenie
kontroli)
 Dependency Injection (DI) – wstrzykiwanie implementacji przez konstruktor, metodę lub właściwość
Zasady SOLID
 Test-driven Development (TDD)
 Zaczynamy od pisania testu nieistniejącej jeszcze funkcjonalności
 Red-Green (od narzędzi)
 Domain-driven Design (DDD)
 Wierne modelowanie logiki biznesowej w kodzie
 Ten sam język, używany przez biznes
 Behavior-driven Design (BDD)
 Evolucja TDD połączona z DDD
 Dokumentacja, specyfikacje, testy sprawdzające zgodność z
założeniami
Inne praktyki
Typowa architektura aplikacji
 Model
 Obiekty domenowe, logika, relacje
 Interfejsy potrzebne do zapisu (Repository)
 Brak referencji do infrastruktury pod spodem
 Repository
 Referencja do modeli
 Implementacja interfejsów repozytorium z projektu modelu
 Application Service
 Gateway do aplikacji
 Komunikacja z frontendem przez DTO
 ViewModele
 Web
 Komunikacja wyłącznie z Application Service
 W odpowiedzi ViewModele
Podział na projekty
Organizacja warstwy
logiki biznesowej
 Proste, proceduralne podejście
 Np. statyczna klasa
 Proste, dobre dla małych aplikacji
 Mniej wymagające dla programistów
 Trudne w utrzymaniu, kiedy aplikacja się rozrasta
Transaction Script
 Efektywne, kiedy struktura bazy odzwierciedla model
biznesowy
 Np. blog
 Każdy obiekt odpowiada za zapis swojego stanu
 Narzędzia do generacji kodu z bazy
 Najpopularniejsze
 Ruby on Rails
 Castle ActiveRecord (.NET)
 Problemy, kiedy model model biznesowy „rozjeżdża” się z
bazą
Active Record
Castle Activerecord - przykład
Post post = Post.Find(postId);
Comment comment = new Comment();
comment.Post = post;
comment.Author = Request.Form["Author"];
comment.DateAdded = DateTime.Now;
comment.Text = Request.Form["Comment"];
comment.Save();
[ActiveRecord("Comments")]
public class Comment : ActiveRecordBase<Comment>
{
[PrimaryKey]
public int Id { get; set; }
[BelongsTo("PostID")]
public Post Post { get; set; }
[Property]
public string Text { get; set; }
[Property]
public string Author { get; set; }
[Property]
public DateTime DateAdded { get; set; }
}
 Całkowite odzwierciedlenie modelu biznesowego w obiektach
 Nie koniecznie 1:1 z bazą
 Nie tylko pojemniki na dane
 Także logika – np. walidacja, relacje między obiektami
 Obiekty nie wiedzą jak się zapisać
 POCO (Plan Old CLR Object) i PI (Persistence Ignorance)
 Domain Service
 Kiedy akcja nie może być wewnątrz samego obiektu
 Np. akcje transferu między dwoma kontami (korzysta z IRepository – same
encje nie powinny korzystać bezpośrednio z IRepository)
 Proste do unit testów!
Domain Model
 ViewMapper – generuje ViewModele na podstawie modelu
 Messaging
 Klasa bazowa + odpowiednie Request i Response
 Application Service (frontend)
 Koordynuje wszystkie aktywności aplikacji
 Deleguje zadania do modelu domenowego
 Może korzystać z repozytorium, kiedy trzeba (np. nowe konto)
 Odbiera wiadomości – wykonuje akcje – odpowiada wiadomością
 Transformuje encje modelu na DTO dla warstwy prezentacji
Domain Model – c.d.
 Antywzorzec
 Podobne do Domain Model
 Wszelkie akcje nie wewnątrz obiektów, ale poza modelem
 Tak naprawdę DTO
 Domain Services w stylu Transaction Script
 Naruszenie zasady „Tell, don’t ask”
Anemic Domain Model
 Metodyka bazująca na wzorcu Domain Model
 Wspólny język deweloperów, ekspertów dziedzinowych
 Usprawnia komunikację między wykonawcami i biznesem
 Ułatwia deweloperom zrozumienie reguł biznesowych
 Encje
 Unikalne, mają identyfikator (np. pesel lub inkrementowany int)
 Value Objects
 Nie mają ID
 Nie żyją same z siebie (np. Transaction – żyje tylko w powiązaniu z Bank Account)
 Aggregate
 Logicznie pogrupowane obiekty pod względem celu modyfikacji danych
 Agreggate Root
 Jedyne encje, do których jest dostęp z zewnątrz agregatu
 Np. dla ecommerce – Order (bo OrderLine czy aplikacja Voucheru zawsze przez Order – walidacja,
itp..)
Domain Driven Design
 Domain Services
 Metody nie pasujące do encji lub wymagające dostępu do repozytorium
 Mogą także zawierać logikę biznesową – jest to część modelu domenowego
 Application Services
 Cienka warstwa pomiędzy modelem i aplikacją
 Brak logiki biznesowej
 Nie przechowuje stanu encji
 Może przechowywać stan workflowu
 Repository
 Odpowiada za zapis danych
 Podział na warstwy
DDD – c.d.
Wzorce warstwy logiki
biznesowej
 Creational pattern (GoF)
 Ukrywanie skomplikowanego tworzenia obiektów
 Z reguły klient nie prosi o konkretną klasę
 Oczekujemy klasy abstrakcyjnej lub interfejsu
 Factory decyduje jaka konkretna implementacja ma być zwrócona
Factory
Factory – c.d.
 np. Factory zwracające obiekt generujący etykiety adresowe
 Nowe cechy dodawane przez kompozycję
 Unikamy tworzenia ogromnej liczby dziedziczących klas
 Np. dodanie zniżki lub przelicznika waluty, logowanie, strumienie
Decorator
 Struktura metody zdefiniowana
 Cześć metod do zdefiniowania przez dziedziczące klasy
Template method
 Zmiana zachowania przy zmianie stanu wewnętrznego
 Podmiana wewnętrznych obiektów odpowiadających za
zachowania
State
 Pozwala wybierać algorytm w czasie wykonywania
Strategy
 Nic nie robi
 Nie chcemy nie wyrzucać wyjątku, ale zgodne z interfejsem
 Np. brak strategii
Null Object
public class NoBasketDiscount : IBasketDiscountStrategy
{
public decimal GetTotalCostAfterApplyingDiscountTo(Basket basket)
{
return basket.TotalCost;
}
}
 Pozwala kolekcje traktować tak jak pojedynczą instancję
Kompozyt
Kompozyt - przykład
//Component
public interface IGraphic
{
void Print();
}
//Leaf
public class Ellipse : IGraphic
{
//Prints the graphic
public void Print()
{
Console.WriteLine("Ellipse");
}
}
public class CompositeGraphic : IGraphic
{
//Collection of Graphics.
private readonly List<IGraphic> graphics;
//Constructor
public CompositeGraphic()
{
//initialize generic Colleciton(Composition)
graphics = new List<IGraphic>();
}
//Adds the graphic to the composition
public void Add(IGraphic graphic)
{
graphics.Add(graphic);
}
//Adds multiple graphics to the composition
public void AddRange(params IGraphic[] graphic)
{
graphics.AddRange(graphic);
}
//Removes the graphic from the composition
public void Delete(IGraphic graphic)
{
graphics.Remove(graphic);
}
//Prints the graphic.
public void Print()
{
foreach (var childGraphic in graphics)
{
childGraphic.Print();
}
}
}
 Specyfikacja – zapisanie prostej reguły (IsSatisfiedBy())
 + np. kompozyt – zagregowanie wielu mniejszych specyfikacji
Kompozyt i specyfikacja
 Iterator
 HasNext, GetNext
 Visitor
 Kiedy potrzebujemy wykonać akcję na danych encjach skomplikowanej
struktury (np. agent, który chodzi po drzewie)
Visitor, Iterator
 W C# w zasadzie gotowe – eventy, delegaty
 Lubi powodować wycieki pamięci
 Strong reference
 Weak Reference
Observer
 Lock, podwójna weryfikacja, static, IoC
 BeforeFieldInit – inicjalizacja bardziej lazy (na początku metody,
która może jej potrzebować)
 W praktyce – na poniższym przykładzie zawsze
 Bez BeforeFieldInit – może być zainicjalizowana przed użyciem
 Sposób: statyczny konstruktor
Singleton
public static void DoSomething(bool which)
{
if (which)
{
FirstType.Foo();
}
else
{
SecondType.Bar();
}
}
Brak inversion of control
Dependency inversion
Interface Inversion – źle!
Interface Inversion - lepiej
Skąd przychodzą zależności?
 Konstruktor
Skąd przychodzą zależności?
 Wstrzykiwanie zależności przez kontener IoC
 StructureMap, Castle Windsor, Spring.NET, Ninject,
PicoContainer.NET, Unity, MEF, …
 Właściwość, konstruktor
 Service Locator
 Bardziej luźno powiązane Factory*
Dependency Injection
OrderService orderService = serviceLocator.Locate<OrderService>(“OrderServiceWithFedExCourier”);
 Kluczowe funkcjonalności te same
 Różne platformy wspierane
 Różnice przy bardziej zaawansowanych scenariuszach
 Przykład - rozszerzenia – np. nasz kod w trakcie wstrzykiwania, itp.
 Porównanie wydajności
 Najszybszy – Simple Injector
DI – który wybrać?
 Layer Super Type
 Unikanie duplikacji
 Np. EntityBase<T>, walidacja
 Interface Segregation
 Dzielimy duży interfejs na kilka mniejszych, pogrupowanych
logicznie
zamiast jednego dużego i NotImplementedException
 Liskov Substitution Principle
 Działanie klasy dziedziczącej powiąż z założeniami kontraktu klasy
bazowej
Inne wzorce enterprise
Warstwa usług
 Wyraźne granice
 Interfejs jak najbardziej czytelny jak możliwe, ujednolicone typy
komunikatów
 Usługi są autonomiczne
 Metody bezstanowe, zmiany atomic, nie konieczna określona
kolejność wywołań
 Współdzielenie kontraktu i schema, nie klas
 Kompatybilność określają polityki (np. WS-Policy)
Najważniejsze zasady SOA
 Fasada - uproszczenie skomplikowanego API
 Adapter – przystosowanie interfejsu jednej klasy do drugiej
Fasada i adapter
 RequestMessage, ResponseMessage, …
 Extension methods do konwersji modelu na komunikat
response
Document Message i Request-Response
 Długotrwały proces, wymagający
przechowywania stanu i wielu
komunikatów
 Unikalny identyfikator po
pierwszym wywołaniu
 Przekazywany przy kolejnych
 Czas ważności
Wzorzec Reservation
 Operacja indempotentna to taka, która może być wywołana wielokrotnie z tymi
samymi parametrami wejściowymi (nie wywołując błędu)
 Wszystkie żądania modyfikujące stan powinny zawierać unikalny identyfikator
 Identyfikator sprawdzany przed przetworzeniem komunikatu
 Jeśli już był przetworzony – zwracana odpowiedź z response store dla danego ID
 Identyfikator może być zwrócony w odpowiedzi (tzw. correlation ID)
Wzorzec Indempotent
Warstwa dostępu do
danych
 Reprezentuje kolekcję obiektów
 Mogą mieć zależności z innymi repozytoriami
 Całkowicie wyizolowane od modelu domenowego
 Interfejs separujący od konkretnej implementacji
 IQueryable nie zalecane
 Osobne dla każdego Aggregate Root
Repository
public interface IRepository<T>
{
IEnumerable<T> FindAll();
IEnumerable<T> FindAll(int index, int count);
IEnumerable<T> FindBy(Query query);
IEnumerable<T> FindBy(Query query, int index, int count);
T FindBy(Guid Id);
void Add(T entity);
void Save(T entity);
void Remove(T entity);
}
 Podobna koncepcja do Repository, ale na niższym poziomie
 Nie ukrywa, że reprezentuje tabelę z bazy
 Z reguły jedno DAO dla jednej tabeli
 Wykorzystywane często przy Active Record i Transaction Script
Data Access Objects
public interface IProductDAO
{
Product Get(int id);
IEnumerable<Product> FindByCategory(int id);
IEnumerable<Product> FindByBrand(int id);
IEnumerable<Product> FindByTopSelling(int count);
void Add(Product product);
void Save(Product product);
void Remove(Product product);
}
 Rejestruje zmiany w obiektach
biznesowych
 Dodanie, usunięcie, zmiana
 Koordynuje zapis zmian w bazie
 Transakcja, konflikty, itp.
 Zapewnia integralność danych
 RegisterAmended – przekazywana
encja
i repozytorium
 Commit wywołuje odpowiednie metody
(np. PersistUpdateOf(acc)) na
odpowiednich repozyzoriach
Unit of Work
 IAggregateRoot – pusty interfejs
 Wzorzec Marker
 Aplikowane do encji będących AggregateRoot
 IUnitOfWorkRepository
 IUnitOfWork
 Wstrzykiwane do repozytorium – wiele repozytoriów może uczestniczyć w transakcji
Główne składniki Unit Of Work
public interface IUnitOfWorkRepository
{
void PersistCreationOf(IAggregateRoot entity);
void PersistUpdateOf(IAggregateRoot entity);
void PersistDeletionOf(IAggregateRoot entity);
}
public interface IUnitOfWork
{
void RegisterAmended(IAggregateRoot entity, IUnitOfWorkRepository unitofWorkRepository);
void RegisterNew(IAggregateRoot entity, IUnitOfWorkRepository unitofWorkRepository);
void RegisterRemoved(IAggregateRoot entity, IUnitOfWorkRepository unitofWorkRepository);
void Commit();
}
 IDbSet – implementacja Repository
 Mimo wszystko chcemy większej abstrakcji
 DbContext – w zasadzie implementacja UoW
 Przydaje się do współdzielenia kontekstu między repozytoriami
UoW i Entity Framework
 Lazy Loading
 Natywnie w .NET – IQueryable
 Proxy
 Maskowanie długotrwałego wywoływania operacji
 Cache, bezpieczeństwo
synchronizacja, …
Proxy
 Upewnia się, że każdy obiekt został załadowany tylko raz
 Dostarcza tą samą wersję obiektów biznesowych transakcji
 Przy dwukrotnym odwoływaniu się do obiektu, ta sama instancja
jest zwracana
 Z reguły stosowane w ramach jednej transakcji
Identity Map
 Reprezentuje zapytanie w języku domenowym
 Unikamy pisania kodu dla każdego zestawu parametrów, np.:
 Pozwala odseparować zapytanie od bazy danych
 QueryTranslator
 Tłumaczy zapytanie na język bazy
 Analogiczne do providerów LINQ
 Lepiej działa z procedurami składowanymi
Query Object
public interface ICustomerRepository
{
IEnumerable<Customer> FindAll();
IEnumerable<Customer> FindAllVIPCustomers();
IEnumerable<Customer> FindByOrder(Guid ID);
IEnumerable<Customer> FindAllCustomersThatHaveOutstandingOrders();
}
Warstwa prezentacji
 Najpopularniejszy wzorzec dla Web Forms / Windows Forms
 Samodzielnie lub ew. frameworki (np. http://webformsmvp.com)
 Model
 Model biznesowy, modyfikowany lub wyświetlany przez widok
 View
 Wyświetla dane modelu pobierane przez Presenter
 Deleguje akcje użytkownika do Presentera
 Interfejs przekazywany do presentera (część private get / set)
 Presenter
 Wywoływany przez widok, w celu reakcji na akcje użytkownika
 Może korzystać ze wstrzykiwanych zależności przez IoC
 Daje się testować, ma wyodrębniony interfejs, brak zależności z httpcontext
Model-View-Presenter (MVP)
MVP – najpopularniejsze odmiany
MVP Passive View
MVP – diagram sekwencji
 Hermetyzacja wykonania akcji
 Execute, CanExecute
 Np. cofnij/ponów, makra, itp.
Command
 Kontroler pierwszy ma kontrolę, wykrywa który widok wyświetlić
 Front Controller
 Pasywny model, aktywny model
 Page Controller – każda strona ma swój kontroler (code behind w ASP.NET)
 Generalnie najlepiej ASP.NET MVC, ale da się samemu (HttpHandlery)
 Łatwiejszy w utrzymaniu, ale więcej pracy
Model-View-Controller (MVC) i Front Controller
Command i Front Controller
Chain of Responsibility
 Łańcuch obiektów typu opakowujących akcję
 Po kolei – wykonanie akcji lub przekazanie dalej
 np. filtry poczty, routing
 Specjalna klasa przesyłana przez AppService do widoku
(DTO)
 Agregacja lub podzbiór danych modelu, potrzebne do
wyświetlenia widoku
 Mapowanie ręczne lub frameworki
 AutoMapper (http://automapper.codeplex.com)
ViewModel
Mapper.CreateMap<Order, OrderDto>();
OrderDto dto = Mapper.Map<Order, OrderDto>(order);
© 2012 Microsoft Corporation. Wszelkie prawa zastrzeżone.
Microsoft, Windows oraz inne nazwy produktów są lub mogą być znakami towarowymi lub zastrzeżonymi znakami towarowymi firmy Microsoft
w Stanach Zjednoczonych i innych krajach. Zamieszczone informacje mają charakter wyłącznie informacyjny. FIRMA MICROSOFT NIE UDZIELA
ŻADNYCH GWARANCJI (WYRAŻONYCH WPROST LUB DOMYŚLNIE), W TYM TAKŻE USTAWOWEJ RĘKOJMI ZA WADY FIZYCZNE I PRAWNE, CO DO
INFORMACJI ZAWARTYCH W TEJ PREZENTACJI.

Mais conteúdo relacionado

Mais procurados

MvvmCross na przykładach w Xamarin.Android
MvvmCross na przykładach w Xamarin.AndroidMvvmCross na przykładach w Xamarin.Android
MvvmCross na przykładach w Xamarin.AndroidIn'saneLab
 
Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013
Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013
Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013Mateusz Stępniak
 
Budowa RESTowego api w oparciu o HATEOAS
Budowa RESTowego api w oparciu o HATEOASBudowa RESTowego api w oparciu o HATEOAS
Budowa RESTowego api w oparciu o HATEOASMateusz Stępniak
 
Webinar - Podstawy Node.js
Webinar - Podstawy Node.jsWebinar - Podstawy Node.js
Webinar - Podstawy Node.jsWojciech Kaniuka
 
Bohater UI bez front end developera ?
Bohater UI bez front end developera ?Bohater UI bez front end developera ?
Bohater UI bez front end developera ?Quick-Solution
 
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbaćBartosz Ratajczyk
 
Exam: 70-511 Enhancing Usability - Windows Application
Exam: 70-511 Enhancing Usability - Windows ApplicationExam: 70-511 Enhancing Usability - Windows Application
Exam: 70-511 Enhancing Usability - Windows ApplicationMaciej Zbrzezny
 
Angular 4 pragmatycznie
Angular 4 pragmatycznieAngular 4 pragmatycznie
Angular 4 pragmatycznieSages
 
My littlemvc 2008 official
My littlemvc 2008 officialMy littlemvc 2008 official
My littlemvc 2008 officialskowronkow
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztatyintive
 
Co nowego w ASP.NET MVC 4?
Co nowego w ASP.NET MVC 4?Co nowego w ASP.NET MVC 4?
Co nowego w ASP.NET MVC 4?tkryskiewicz
 
Wzorce Repository, Unity of Work, Devexpress MVC w architekturze Asp.net MVC
Wzorce Repository, Unity of Work, Devexpress MVC  w architekturze Asp.net MVCWzorce Repository, Unity of Work, Devexpress MVC  w architekturze Asp.net MVC
Wzorce Repository, Unity of Work, Devexpress MVC w architekturze Asp.net MVCQuick-Solution
 
Seam framework in_action
Seam framework in_actionSeam framework in_action
Seam framework in_actionMichał Orman
 
AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptJacek Okrojek
 
Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)Laravel Poland MeetUp
 

Mais procurados (20)

MvvmCross na przykładach w Xamarin.Android
MvvmCross na przykładach w Xamarin.AndroidMvvmCross na przykładach w Xamarin.Android
MvvmCross na przykładach w Xamarin.Android
 
JavaScript, Moduły
JavaScript, ModułyJavaScript, Moduły
JavaScript, Moduły
 
Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013
Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013
Budowa poprawnego i intuicyjnego api REST HATEOAS devfest@2013
 
Budowa RESTowego api w oparciu o HATEOAS
Budowa RESTowego api w oparciu o HATEOASBudowa RESTowego api w oparciu o HATEOAS
Budowa RESTowego api w oparciu o HATEOAS
 
Webinar - Podstawy Node.js
Webinar - Podstawy Node.jsWebinar - Podstawy Node.js
Webinar - Podstawy Node.js
 
Silverlight i PHP
Silverlight i PHPSilverlight i PHP
Silverlight i PHP
 
Bohater UI bez front end developera ?
Bohater UI bez front end developera ?Bohater UI bez front end developera ?
Bohater UI bez front end developera ?
 
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
 
Exam: 70-511 Enhancing Usability - Windows Application
Exam: 70-511 Enhancing Usability - Windows ApplicationExam: 70-511 Enhancing Usability - Windows Application
Exam: 70-511 Enhancing Usability - Windows Application
 
Angular 4 pragmatycznie
Angular 4 pragmatycznieAngular 4 pragmatycznie
Angular 4 pragmatycznie
 
AJAX - wdw1
AJAX - wdw1AJAX - wdw1
AJAX - wdw1
 
My littlemvc 2008 official
My littlemvc 2008 officialMy littlemvc 2008 official
My littlemvc 2008 official
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztaty
 
Wprowadzenie do PHPUnit
Wprowadzenie do PHPUnitWprowadzenie do PHPUnit
Wprowadzenie do PHPUnit
 
Co nowego w ASP.NET MVC 4?
Co nowego w ASP.NET MVC 4?Co nowego w ASP.NET MVC 4?
Co nowego w ASP.NET MVC 4?
 
Wzorce Repository, Unity of Work, Devexpress MVC w architekturze Asp.net MVC
Wzorce Repository, Unity of Work, Devexpress MVC  w architekturze Asp.net MVCWzorce Repository, Unity of Work, Devexpress MVC  w architekturze Asp.net MVC
Wzorce Repository, Unity of Work, Devexpress MVC w architekturze Asp.net MVC
 
Seam framework in_action
Seam framework in_actionSeam framework in_action
Seam framework in_action
 
AADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScriptAADays 2015 - Jak to zrobic w JavaScript
AADays 2015 - Jak to zrobic w JavaScript
 
Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)Cykl życia zapytania HTTP (pod maską)
Cykl życia zapytania HTTP (pod maską)
 
Behat
BehatBehat
Behat
 

Destaque

Przeszukiwanie przestrzeni rozwiązań
Przeszukiwanie przestrzeni rozwiązańPrzeszukiwanie przestrzeni rozwiązań
Przeszukiwanie przestrzeni rozwiązańAleksander Pohl
 
Rola badań marketingowych w podejmowaniu decyzji rynkowych
Rola badań marketingowych w podejmowaniu decyzji rynkowychRola badań marketingowych w podejmowaniu decyzji rynkowych
Rola badań marketingowych w podejmowaniu decyzji rynkowychRadek Oryszczyszyn
 
Statystyka Po Ludzku
Statystyka Po LudzkuStatystyka Po Ludzku
Statystyka Po LudzkuAdam
 
Podpis elektroniczny w obrocie prawnym - ebook
Podpis elektroniczny w obrocie prawnym - ebookPodpis elektroniczny w obrocie prawnym - ebook
Podpis elektroniczny w obrocie prawnym - ebooke-booksweb.pl
 
Przegląd rynkowy rozwiązań kolektorów słonecznych
Przegląd rynkowy rozwiązań kolektorów słonecznychPrzegląd rynkowy rozwiązań kolektorów słonecznych
Przegląd rynkowy rozwiązań kolektorów słonecznychHewalex Sp. z o.o. Sp.K.
 
Srodki Zwiotczajace Part 2
Srodki Zwiotczajace Part 2Srodki Zwiotczajace Part 2
Srodki Zwiotczajace Part 2Polanest
 
SQL Reporting Services 2016 + SharePoint 2016
SQL Reporting Services 2016 + SharePoint 2016SQL Reporting Services 2016 + SharePoint 2016
SQL Reporting Services 2016 + SharePoint 2016Datapolis
 
Goleman Daniel Inteligencja Emocjonalna
Goleman Daniel   Inteligencja EmocjonalnaGoleman Daniel   Inteligencja Emocjonalna
Goleman Daniel Inteligencja Emocjonalnaguesta0cf438
 
Co nowego w podatku CIT w 2017 r.?
Co nowego w podatku CIT w 2017 r.?Co nowego w podatku CIT w 2017 r.?
Co nowego w podatku CIT w 2017 r.?PwC Polska
 
A01 Metodologia Projektowa
A01 Metodologia ProjektowaA01 Metodologia Projektowa
A01 Metodologia ProjektowaUM Łódzkie
 
Індивідуальні бесіди з учнями
Індивідуальні бесіди з учнямиІндивідуальні бесіди з учнями
Індивідуальні бесіди з учнямиlelipusik
 
Jak Prowadzic Tani I Skuteczny Marketing
Jak Prowadzic Tani I Skuteczny MarketingJak Prowadzic Tani I Skuteczny Marketing
Jak Prowadzic Tani I Skuteczny MarketingHalik990
 

Destaque (20)

Przeszukiwanie przestrzeni rozwiązań
Przeszukiwanie przestrzeni rozwiązańPrzeszukiwanie przestrzeni rozwiązań
Przeszukiwanie przestrzeni rozwiązań
 
Rola badań marketingowych w podejmowaniu decyzji rynkowych
Rola badań marketingowych w podejmowaniu decyzji rynkowychRola badań marketingowych w podejmowaniu decyzji rynkowych
Rola badań marketingowych w podejmowaniu decyzji rynkowych
 
Statystyka Po Ludzku
Statystyka Po LudzkuStatystyka Po Ludzku
Statystyka Po Ludzku
 
Podpis elektroniczny w obrocie prawnym - ebook
Podpis elektroniczny w obrocie prawnym - ebookPodpis elektroniczny w obrocie prawnym - ebook
Podpis elektroniczny w obrocie prawnym - ebook
 
Przegląd rynkowy rozwiązań kolektorów słonecznych
Przegląd rynkowy rozwiązań kolektorów słonecznychPrzegląd rynkowy rozwiązań kolektorów słonecznych
Przegląd rynkowy rozwiązań kolektorów słonecznych
 
Agresja – jak przeciwdziałać agresywnym zachowaniom
Agresja – jak przeciwdziałać agresywnym zachowaniomAgresja – jak przeciwdziałać agresywnym zachowaniom
Agresja – jak przeciwdziałać agresywnym zachowaniom
 
Srodki Zwiotczajace Part 2
Srodki Zwiotczajace Part 2Srodki Zwiotczajace Part 2
Srodki Zwiotczajace Part 2
 
Przetwarzanie mleka
Przetwarzanie mlekaPrzetwarzanie mleka
Przetwarzanie mleka
 
SQL Reporting Services 2016 + SharePoint 2016
SQL Reporting Services 2016 + SharePoint 2016SQL Reporting Services 2016 + SharePoint 2016
SQL Reporting Services 2016 + SharePoint 2016
 
Goleman Daniel Inteligencja Emocjonalna
Goleman Daniel   Inteligencja EmocjonalnaGoleman Daniel   Inteligencja Emocjonalna
Goleman Daniel Inteligencja Emocjonalna
 
Co nowego w podatku CIT w 2017 r.?
Co nowego w podatku CIT w 2017 r.?Co nowego w podatku CIT w 2017 r.?
Co nowego w podatku CIT w 2017 r.?
 
A01 Metodologia Projektowa
A01 Metodologia ProjektowaA01 Metodologia Projektowa
A01 Metodologia Projektowa
 
7
77
7
 
Autyzm II
Autyzm IIAutyzm II
Autyzm II
 
Індивідуальні бесіди з учнями
Індивідуальні бесіди з учнямиІндивідуальні бесіди з учнями
Індивідуальні бесіди з учнями
 
Matematyka 2
Matematyka 2Matematyka 2
Matematyka 2
 
Społeczna odpowiedzialność biznesu jako wyraz reorientacji działania współcze...
Społeczna odpowiedzialność biznesu jako wyraz reorientacji działania współcze...Społeczna odpowiedzialność biznesu jako wyraz reorientacji działania współcze...
Społeczna odpowiedzialność biznesu jako wyraz reorientacji działania współcze...
 
Organizacja XXI wieku
Organizacja XXI wiekuOrganizacja XXI wieku
Organizacja XXI wieku
 
5.2 fryzjer
5.2 fryzjer5.2 fryzjer
5.2 fryzjer
 
Jak Prowadzic Tani I Skuteczny Marketing
Jak Prowadzic Tani I Skuteczny MarketingJak Prowadzic Tani I Skuteczny Marketing
Jak Prowadzic Tani I Skuteczny Marketing
 

Semelhante a Wzorce projektowe (w ASP.NET i nie tylko)

Architektura aplikacji android
Architektura aplikacji androidArchitektura aplikacji android
Architektura aplikacji androidSages
 
Czy można napisać dobry MONOLIT?
Czy można napisać dobry MONOLIT?Czy można napisać dobry MONOLIT?
Czy można napisać dobry MONOLIT?Tomasz Tomczyk
 
4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...
4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...
4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...PROIDEA
 
Domain Driven Development
Domain Driven DevelopmentDomain Driven Development
Domain Driven DevelopmentKonrad Russa
 
Wprowadzenie do React
Wprowadzenie do ReactWprowadzenie do React
Wprowadzenie do ReactBrainhub
 
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?PHPCon Poland
 
[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?
[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?
[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?Andrzej Krzywda
 
REvolution, czyli o bardziej obiektowym podejściu w Railsach
REvolution, czyli o bardziej obiektowym podejściu w RailsachREvolution, czyli o bardziej obiektowym podejściu w Railsach
REvolution, czyli o bardziej obiektowym podejściu w RailsachThe Software House
 
Mts 2013 tomasz kopacz - wydajność aplikacji dla windows 8 - jak ją mierzyć...
Mts 2013   tomasz kopacz - wydajność aplikacji dla windows 8 - jak ją mierzyć...Mts 2013   tomasz kopacz - wydajność aplikacji dla windows 8 - jak ją mierzyć...
Mts 2013 tomasz kopacz - wydajność aplikacji dla windows 8 - jak ją mierzyć...Tomasz Kopacz
 
Integracja systemow od strony praktycznej
Integracja systemow od strony praktycznejIntegracja systemow od strony praktycznej
Integracja systemow od strony praktycznejMarek Horbań
 
Drupal Rules - Drupal Idzie Na Studia - Jarosław Sobiecki
Drupal Rules - Drupal Idzie Na Studia - Jarosław SobieckiDrupal Rules - Drupal Idzie Na Studia - Jarosław Sobiecki
Drupal Rules - Drupal Idzie Na Studia - Jarosław SobieckiGrzegorz Bartman
 
Wprowadzenie do MEF w .NET 4.0
Wprowadzenie do MEF w .NET 4.0Wprowadzenie do MEF w .NET 4.0
Wprowadzenie do MEF w .NET 4.0Maciej Zbrzezny
 
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...Bartłomiej Miś
 
#3 Frontend Meetup - RequireJS
#3 Frontend Meetup - RequireJS#3 Frontend Meetup - RequireJS
#3 Frontend Meetup - RequireJSMaciej Grajcarek
 
Nie tylko C# - Ekosystem Microsoft dla programistów
Nie tylko C# - Ekosystem Microsoft dla programistówNie tylko C# - Ekosystem Microsoft dla programistów
Nie tylko C# - Ekosystem Microsoft dla programistówintive
 
Struktura i własności systemu zarządzania treścią Drupal
Struktura i własności systemu zarządzania treścią DrupalStruktura i własności systemu zarządzania treścią Drupal
Struktura i własności systemu zarządzania treścią DrupalGrzegorz Bartman
 

Semelhante a Wzorce projektowe (w ASP.NET i nie tylko) (20)

Architektura aplikacji android
Architektura aplikacji androidArchitektura aplikacji android
Architektura aplikacji android
 
Czy można napisać dobry MONOLIT?
Czy można napisać dobry MONOLIT?Czy można napisać dobry MONOLIT?
Czy można napisać dobry MONOLIT?
 
4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...
4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...
4Developers 2015: Przejrzysty i testowalny kod na Androidzie? Spróbujmy z Cle...
 
Domain Driven Development
Domain Driven DevelopmentDomain Driven Development
Domain Driven Development
 
Wprowadzenie do React
Wprowadzenie do ReactWprowadzenie do React
Wprowadzenie do React
 
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?
Silverlight i PHP - jak budować interfejs nowoczesnych aplikacji internetowych?
 
Podstawy ETL z SSIS
Podstawy ETL z SSISPodstawy ETL z SSIS
Podstawy ETL z SSIS
 
[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?
[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?
[PL] PRUG Luty 2022 - Service objecty to za mało - jak żyć z Railsami?
 
REvolution, czyli o bardziej obiektowym podejściu w Railsach
REvolution, czyli o bardziej obiektowym podejściu w RailsachREvolution, czyli o bardziej obiektowym podejściu w Railsach
REvolution, czyli o bardziej obiektowym podejściu w Railsach
 
Mts 2013 tomasz kopacz - wydajność aplikacji dla windows 8 - jak ją mierzyć...
Mts 2013   tomasz kopacz - wydajność aplikacji dla windows 8 - jak ją mierzyć...Mts 2013   tomasz kopacz - wydajność aplikacji dla windows 8 - jak ją mierzyć...
Mts 2013 tomasz kopacz - wydajność aplikacji dla windows 8 - jak ją mierzyć...
 
university day 1
university day 1university day 1
university day 1
 
Integracja systemow od strony praktycznej
Integracja systemow od strony praktycznejIntegracja systemow od strony praktycznej
Integracja systemow od strony praktycznej
 
Drupal Rules - Drupal Idzie Na Studia - Jarosław Sobiecki
Drupal Rules - Drupal Idzie Na Studia - Jarosław SobieckiDrupal Rules - Drupal Idzie Na Studia - Jarosław Sobiecki
Drupal Rules - Drupal Idzie Na Studia - Jarosław Sobiecki
 
Wprowadzenie do MEF w .NET 4.0
Wprowadzenie do MEF w .NET 4.0Wprowadzenie do MEF w .NET 4.0
Wprowadzenie do MEF w .NET 4.0
 
Ext js
Ext jsExt js
Ext js
 
JavaEE + OSGi
JavaEE + OSGiJavaEE + OSGi
JavaEE + OSGi
 
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...
4Developers 2023: frontendowe optymalizacje wydajności / Bartek Miś / Web Dev...
 
#3 Frontend Meetup - RequireJS
#3 Frontend Meetup - RequireJS#3 Frontend Meetup - RequireJS
#3 Frontend Meetup - RequireJS
 
Nie tylko C# - Ekosystem Microsoft dla programistów
Nie tylko C# - Ekosystem Microsoft dla programistówNie tylko C# - Ekosystem Microsoft dla programistów
Nie tylko C# - Ekosystem Microsoft dla programistów
 
Struktura i własności systemu zarządzania treścią Drupal
Struktura i własności systemu zarządzania treścią DrupalStruktura i własności systemu zarządzania treścią Drupal
Struktura i własności systemu zarządzania treścią Drupal
 

Wzorce projektowe (w ASP.NET i nie tylko)

  • 2.  Keep It Simple Stupid (KISS)  Don’t Repeat Yourself (DRY)  Tell, Don’t Ask (reguła Hollywood)  Wydajemy polecenie obiektom, zamiast pytać o ich stan i wykonywać akcję  You Ain’t Gonna Need It (YAGNI) – tylko to, co niezbędne  Separation of Concerns (SoC) Główne zasady
  • 3.  Single Responsibility Principle (SRP)  Nie monolityczna konstrukcja (scyzoryk), 1 powód do zmiany stanu  Open-Closed Principle (OCP)  Klasy powinny być otwarte na rozszerzenia, ale zamknięte na zmiany (brak problemów podczas modyfikacji klas bazowych)  Liskov Substitution Principle (LSP)  Możliwość podmienienia każdej dziedziczącej klasy z klasą bazową, bez wpływu na działanie  Interface Segregation Principle (ISP)  Grupowanie interfejsu na mniejsze  Dependency Inversion Principle (DIP)  Zależność od abstrakcji, nie konkretnej implementacji  Inversion of Control (IoC) – kontener / framework wstrzykujący konkretną implementację (odwrócenie kontroli)  Dependency Injection (DI) – wstrzykiwanie implementacji przez konstruktor, metodę lub właściwość Zasady SOLID
  • 4.  Test-driven Development (TDD)  Zaczynamy od pisania testu nieistniejącej jeszcze funkcjonalności  Red-Green (od narzędzi)  Domain-driven Design (DDD)  Wierne modelowanie logiki biznesowej w kodzie  Ten sam język, używany przez biznes  Behavior-driven Design (BDD)  Evolucja TDD połączona z DDD  Dokumentacja, specyfikacje, testy sprawdzające zgodność z założeniami Inne praktyki
  • 6.  Model  Obiekty domenowe, logika, relacje  Interfejsy potrzebne do zapisu (Repository)  Brak referencji do infrastruktury pod spodem  Repository  Referencja do modeli  Implementacja interfejsów repozytorium z projektu modelu  Application Service  Gateway do aplikacji  Komunikacja z frontendem przez DTO  ViewModele  Web  Komunikacja wyłącznie z Application Service  W odpowiedzi ViewModele Podział na projekty
  • 8.  Proste, proceduralne podejście  Np. statyczna klasa  Proste, dobre dla małych aplikacji  Mniej wymagające dla programistów  Trudne w utrzymaniu, kiedy aplikacja się rozrasta Transaction Script
  • 9.  Efektywne, kiedy struktura bazy odzwierciedla model biznesowy  Np. blog  Każdy obiekt odpowiada za zapis swojego stanu  Narzędzia do generacji kodu z bazy  Najpopularniejsze  Ruby on Rails  Castle ActiveRecord (.NET)  Problemy, kiedy model model biznesowy „rozjeżdża” się z bazą Active Record
  • 10. Castle Activerecord - przykład Post post = Post.Find(postId); Comment comment = new Comment(); comment.Post = post; comment.Author = Request.Form["Author"]; comment.DateAdded = DateTime.Now; comment.Text = Request.Form["Comment"]; comment.Save(); [ActiveRecord("Comments")] public class Comment : ActiveRecordBase<Comment> { [PrimaryKey] public int Id { get; set; } [BelongsTo("PostID")] public Post Post { get; set; } [Property] public string Text { get; set; } [Property] public string Author { get; set; } [Property] public DateTime DateAdded { get; set; } }
  • 11.  Całkowite odzwierciedlenie modelu biznesowego w obiektach  Nie koniecznie 1:1 z bazą  Nie tylko pojemniki na dane  Także logika – np. walidacja, relacje między obiektami  Obiekty nie wiedzą jak się zapisać  POCO (Plan Old CLR Object) i PI (Persistence Ignorance)  Domain Service  Kiedy akcja nie może być wewnątrz samego obiektu  Np. akcje transferu między dwoma kontami (korzysta z IRepository – same encje nie powinny korzystać bezpośrednio z IRepository)  Proste do unit testów! Domain Model
  • 12.  ViewMapper – generuje ViewModele na podstawie modelu  Messaging  Klasa bazowa + odpowiednie Request i Response  Application Service (frontend)  Koordynuje wszystkie aktywności aplikacji  Deleguje zadania do modelu domenowego  Może korzystać z repozytorium, kiedy trzeba (np. nowe konto)  Odbiera wiadomości – wykonuje akcje – odpowiada wiadomością  Transformuje encje modelu na DTO dla warstwy prezentacji Domain Model – c.d.
  • 13.  Antywzorzec  Podobne do Domain Model  Wszelkie akcje nie wewnątrz obiektów, ale poza modelem  Tak naprawdę DTO  Domain Services w stylu Transaction Script  Naruszenie zasady „Tell, don’t ask” Anemic Domain Model
  • 14.  Metodyka bazująca na wzorcu Domain Model  Wspólny język deweloperów, ekspertów dziedzinowych  Usprawnia komunikację między wykonawcami i biznesem  Ułatwia deweloperom zrozumienie reguł biznesowych  Encje  Unikalne, mają identyfikator (np. pesel lub inkrementowany int)  Value Objects  Nie mają ID  Nie żyją same z siebie (np. Transaction – żyje tylko w powiązaniu z Bank Account)  Aggregate  Logicznie pogrupowane obiekty pod względem celu modyfikacji danych  Agreggate Root  Jedyne encje, do których jest dostęp z zewnątrz agregatu  Np. dla ecommerce – Order (bo OrderLine czy aplikacja Voucheru zawsze przez Order – walidacja, itp..) Domain Driven Design
  • 15.  Domain Services  Metody nie pasujące do encji lub wymagające dostępu do repozytorium  Mogą także zawierać logikę biznesową – jest to część modelu domenowego  Application Services  Cienka warstwa pomiędzy modelem i aplikacją  Brak logiki biznesowej  Nie przechowuje stanu encji  Może przechowywać stan workflowu  Repository  Odpowiada za zapis danych  Podział na warstwy DDD – c.d.
  • 17.  Creational pattern (GoF)  Ukrywanie skomplikowanego tworzenia obiektów  Z reguły klient nie prosi o konkretną klasę  Oczekujemy klasy abstrakcyjnej lub interfejsu  Factory decyduje jaka konkretna implementacja ma być zwrócona Factory
  • 18. Factory – c.d.  np. Factory zwracające obiekt generujący etykiety adresowe
  • 19.  Nowe cechy dodawane przez kompozycję  Unikamy tworzenia ogromnej liczby dziedziczących klas  Np. dodanie zniżki lub przelicznika waluty, logowanie, strumienie Decorator
  • 20.  Struktura metody zdefiniowana  Cześć metod do zdefiniowania przez dziedziczące klasy Template method
  • 21.  Zmiana zachowania przy zmianie stanu wewnętrznego  Podmiana wewnętrznych obiektów odpowiadających za zachowania State
  • 22.  Pozwala wybierać algorytm w czasie wykonywania Strategy
  • 23.  Nic nie robi  Nie chcemy nie wyrzucać wyjątku, ale zgodne z interfejsem  Np. brak strategii Null Object public class NoBasketDiscount : IBasketDiscountStrategy { public decimal GetTotalCostAfterApplyingDiscountTo(Basket basket) { return basket.TotalCost; } }
  • 24.  Pozwala kolekcje traktować tak jak pojedynczą instancję Kompozyt
  • 25. Kompozyt - przykład //Component public interface IGraphic { void Print(); } //Leaf public class Ellipse : IGraphic { //Prints the graphic public void Print() { Console.WriteLine("Ellipse"); } } public class CompositeGraphic : IGraphic { //Collection of Graphics. private readonly List<IGraphic> graphics; //Constructor public CompositeGraphic() { //initialize generic Colleciton(Composition) graphics = new List<IGraphic>(); } //Adds the graphic to the composition public void Add(IGraphic graphic) { graphics.Add(graphic); } //Adds multiple graphics to the composition public void AddRange(params IGraphic[] graphic) { graphics.AddRange(graphic); } //Removes the graphic from the composition public void Delete(IGraphic graphic) { graphics.Remove(graphic); } //Prints the graphic. public void Print() { foreach (var childGraphic in graphics) { childGraphic.Print(); } } }
  • 26.  Specyfikacja – zapisanie prostej reguły (IsSatisfiedBy())  + np. kompozyt – zagregowanie wielu mniejszych specyfikacji Kompozyt i specyfikacja
  • 27.  Iterator  HasNext, GetNext  Visitor  Kiedy potrzebujemy wykonać akcję na danych encjach skomplikowanej struktury (np. agent, który chodzi po drzewie) Visitor, Iterator
  • 28.  W C# w zasadzie gotowe – eventy, delegaty  Lubi powodować wycieki pamięci  Strong reference  Weak Reference Observer
  • 29.  Lock, podwójna weryfikacja, static, IoC  BeforeFieldInit – inicjalizacja bardziej lazy (na początku metody, która może jej potrzebować)  W praktyce – na poniższym przykładzie zawsze  Bez BeforeFieldInit – może być zainicjalizowana przed użyciem  Sposób: statyczny konstruktor Singleton public static void DoSomething(bool which) { if (which) { FirstType.Foo(); } else { SecondType.Bar(); } }
  • 30. Brak inversion of control
  • 36.  Wstrzykiwanie zależności przez kontener IoC  StructureMap, Castle Windsor, Spring.NET, Ninject, PicoContainer.NET, Unity, MEF, …  Właściwość, konstruktor  Service Locator  Bardziej luźno powiązane Factory* Dependency Injection OrderService orderService = serviceLocator.Locate<OrderService>(“OrderServiceWithFedExCourier”);
  • 37.  Kluczowe funkcjonalności te same  Różne platformy wspierane  Różnice przy bardziej zaawansowanych scenariuszach  Przykład - rozszerzenia – np. nasz kod w trakcie wstrzykiwania, itp.  Porównanie wydajności  Najszybszy – Simple Injector DI – który wybrać?
  • 38.  Layer Super Type  Unikanie duplikacji  Np. EntityBase<T>, walidacja  Interface Segregation  Dzielimy duży interfejs na kilka mniejszych, pogrupowanych logicznie zamiast jednego dużego i NotImplementedException  Liskov Substitution Principle  Działanie klasy dziedziczącej powiąż z założeniami kontraktu klasy bazowej Inne wzorce enterprise
  • 40.  Wyraźne granice  Interfejs jak najbardziej czytelny jak możliwe, ujednolicone typy komunikatów  Usługi są autonomiczne  Metody bezstanowe, zmiany atomic, nie konieczna określona kolejność wywołań  Współdzielenie kontraktu i schema, nie klas  Kompatybilność określają polityki (np. WS-Policy) Najważniejsze zasady SOA
  • 41.  Fasada - uproszczenie skomplikowanego API  Adapter – przystosowanie interfejsu jednej klasy do drugiej Fasada i adapter
  • 42.  RequestMessage, ResponseMessage, …  Extension methods do konwersji modelu na komunikat response Document Message i Request-Response
  • 43.  Długotrwały proces, wymagający przechowywania stanu i wielu komunikatów  Unikalny identyfikator po pierwszym wywołaniu  Przekazywany przy kolejnych  Czas ważności Wzorzec Reservation
  • 44.  Operacja indempotentna to taka, która może być wywołana wielokrotnie z tymi samymi parametrami wejściowymi (nie wywołując błędu)  Wszystkie żądania modyfikujące stan powinny zawierać unikalny identyfikator  Identyfikator sprawdzany przed przetworzeniem komunikatu  Jeśli już był przetworzony – zwracana odpowiedź z response store dla danego ID  Identyfikator może być zwrócony w odpowiedzi (tzw. correlation ID) Wzorzec Indempotent
  • 46.  Reprezentuje kolekcję obiektów  Mogą mieć zależności z innymi repozytoriami  Całkowicie wyizolowane od modelu domenowego  Interfejs separujący od konkretnej implementacji  IQueryable nie zalecane  Osobne dla każdego Aggregate Root Repository public interface IRepository<T> { IEnumerable<T> FindAll(); IEnumerable<T> FindAll(int index, int count); IEnumerable<T> FindBy(Query query); IEnumerable<T> FindBy(Query query, int index, int count); T FindBy(Guid Id); void Add(T entity); void Save(T entity); void Remove(T entity); }
  • 47.  Podobna koncepcja do Repository, ale na niższym poziomie  Nie ukrywa, że reprezentuje tabelę z bazy  Z reguły jedno DAO dla jednej tabeli  Wykorzystywane często przy Active Record i Transaction Script Data Access Objects public interface IProductDAO { Product Get(int id); IEnumerable<Product> FindByCategory(int id); IEnumerable<Product> FindByBrand(int id); IEnumerable<Product> FindByTopSelling(int count); void Add(Product product); void Save(Product product); void Remove(Product product); }
  • 48.  Rejestruje zmiany w obiektach biznesowych  Dodanie, usunięcie, zmiana  Koordynuje zapis zmian w bazie  Transakcja, konflikty, itp.  Zapewnia integralność danych  RegisterAmended – przekazywana encja i repozytorium  Commit wywołuje odpowiednie metody (np. PersistUpdateOf(acc)) na odpowiednich repozyzoriach Unit of Work
  • 49.  IAggregateRoot – pusty interfejs  Wzorzec Marker  Aplikowane do encji będących AggregateRoot  IUnitOfWorkRepository  IUnitOfWork  Wstrzykiwane do repozytorium – wiele repozytoriów może uczestniczyć w transakcji Główne składniki Unit Of Work public interface IUnitOfWorkRepository { void PersistCreationOf(IAggregateRoot entity); void PersistUpdateOf(IAggregateRoot entity); void PersistDeletionOf(IAggregateRoot entity); } public interface IUnitOfWork { void RegisterAmended(IAggregateRoot entity, IUnitOfWorkRepository unitofWorkRepository); void RegisterNew(IAggregateRoot entity, IUnitOfWorkRepository unitofWorkRepository); void RegisterRemoved(IAggregateRoot entity, IUnitOfWorkRepository unitofWorkRepository); void Commit(); }
  • 50.  IDbSet – implementacja Repository  Mimo wszystko chcemy większej abstrakcji  DbContext – w zasadzie implementacja UoW  Przydaje się do współdzielenia kontekstu między repozytoriami UoW i Entity Framework
  • 51.  Lazy Loading  Natywnie w .NET – IQueryable  Proxy  Maskowanie długotrwałego wywoływania operacji  Cache, bezpieczeństwo synchronizacja, … Proxy
  • 52.  Upewnia się, że każdy obiekt został załadowany tylko raz  Dostarcza tą samą wersję obiektów biznesowych transakcji  Przy dwukrotnym odwoływaniu się do obiektu, ta sama instancja jest zwracana  Z reguły stosowane w ramach jednej transakcji Identity Map
  • 53.  Reprezentuje zapytanie w języku domenowym  Unikamy pisania kodu dla każdego zestawu parametrów, np.:  Pozwala odseparować zapytanie od bazy danych  QueryTranslator  Tłumaczy zapytanie na język bazy  Analogiczne do providerów LINQ  Lepiej działa z procedurami składowanymi Query Object public interface ICustomerRepository { IEnumerable<Customer> FindAll(); IEnumerable<Customer> FindAllVIPCustomers(); IEnumerable<Customer> FindByOrder(Guid ID); IEnumerable<Customer> FindAllCustomersThatHaveOutstandingOrders(); }
  • 55.  Najpopularniejszy wzorzec dla Web Forms / Windows Forms  Samodzielnie lub ew. frameworki (np. http://webformsmvp.com)  Model  Model biznesowy, modyfikowany lub wyświetlany przez widok  View  Wyświetla dane modelu pobierane przez Presenter  Deleguje akcje użytkownika do Presentera  Interfejs przekazywany do presentera (część private get / set)  Presenter  Wywoływany przez widok, w celu reakcji na akcje użytkownika  Może korzystać ze wstrzykiwanych zależności przez IoC  Daje się testować, ma wyodrębniony interfejs, brak zależności z httpcontext Model-View-Presenter (MVP)
  • 58. MVP – diagram sekwencji
  • 59.  Hermetyzacja wykonania akcji  Execute, CanExecute  Np. cofnij/ponów, makra, itp. Command
  • 60.  Kontroler pierwszy ma kontrolę, wykrywa który widok wyświetlić  Front Controller  Pasywny model, aktywny model  Page Controller – każda strona ma swój kontroler (code behind w ASP.NET)  Generalnie najlepiej ASP.NET MVC, ale da się samemu (HttpHandlery)  Łatwiejszy w utrzymaniu, ale więcej pracy Model-View-Controller (MVC) i Front Controller
  • 61. Command i Front Controller
  • 62. Chain of Responsibility  Łańcuch obiektów typu opakowujących akcję  Po kolei – wykonanie akcji lub przekazanie dalej  np. filtry poczty, routing
  • 63.  Specjalna klasa przesyłana przez AppService do widoku (DTO)  Agregacja lub podzbiór danych modelu, potrzebne do wyświetlenia widoku  Mapowanie ręczne lub frameworki  AutoMapper (http://automapper.codeplex.com) ViewModel Mapper.CreateMap<Order, OrderDto>(); OrderDto dto = Mapper.Map<Order, OrderDto>(order);
  • 64. © 2012 Microsoft Corporation. Wszelkie prawa zastrzeżone. Microsoft, Windows oraz inne nazwy produktów są lub mogą być znakami towarowymi lub zastrzeżonymi znakami towarowymi firmy Microsoft w Stanach Zjednoczonych i innych krajach. Zamieszczone informacje mają charakter wyłącznie informacyjny. FIRMA MICROSOFT NIE UDZIELA ŻADNYCH GWARANCJI (WYRAŻONYCH WPROST LUB DOMYŚLNIE), W TYM TAKŻE USTAWOWEJ RĘKOJMI ZA WADY FIZYCZNE I PRAWNE, CO DO INFORMACJI ZAWARTYCH W TEJ PREZENTACJI.