Arkitektur principper og design mønstre til realisering af enterprise applikationer baseret på rige domænemodeller (og.net) Kim Harding Christensen EOS A/S Margrethepladsen 3 8000 Århus TLF: 8732 8787 http://www.eos.dk
Abstract Ifølge Martin Fowler [PoEAA] er der to hovedmønstre til at strukturere typiske enterprise applikationer; Transaction Script og Domain Model. Dette indlæg giver en introduktion til hvad en domænemodel er, hvilke fordele der kan være ved at basere sin arkitektur på en domænemodel, samt praktiske design mønstre, der hjælper til at strukturere domænemodellen. Der vil blive vist C# kode (Whidbey), som illustrerer implementationen af de enkelte design mønstre. Vi vil også diskutere hvordan service orientering og domænemodeller hænger sammen. EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (2)
Formål Formålet er at give en introduktion til området og forhåbentligt gøre jer interesseret i at finde mere information om emnet. Det at være domænemodel fikseret er i høj grad en mental tilstand, som for mange kræver en del tilvænning. Formålet er IKKE at I skal standse al igangværende udvikling og skifte hest. EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (3)
Agenda Introduktion til domænemodeller Modellering (i farve) Lidt om udviklingsproces Patterns til strukturering af domænemodeller C# eksempler på implementering SO(A) og Domænemodeller EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (4)
Introduktion til domænemodeller EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (5)
Kontekst Præsentation Rig klient (Windows), Web, kommandolinie Visning af data, håndtere brugerinput Domænelogik Forretningslogik Data-adgang Adgang til RDBMS, beskedsystem, ERP, EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (6)
Domænelogik Præsentation Domænelogik Data-adgang To hovedretninger: Transaction Script (procedural) Domain Model (objektorienteret) EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (7)
Transaction Script Organiserer forretningslogik i form af procedurer, hvor hver procedure håndterer et enkelt request fra præsentationen Et Transaction Script kalder databasen direkte eller gennem en tynd databasewrapper EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (8)
Transaction Script fordele/ulemper Fordele Alle kan lære at bruge transaction script Simpel at implementere Minimal performance overhead Ulemper Resulterer let i Cut & Paste programmering Svær at vedligeholde Samme fejl propagerer rundt i kodebasen og skal rettes mange steder Skalerer ikke til komplicerede opgaver EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (9)
Domain Model Organiserer domænelogikken i form at et sæt objekter, der arbejder sammen for at løse forretningsoperationer & forretningsregler De begreber, der findes i problemområdet, findes som klasser i domænemodellen Indbegrebet af Objektorientering EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (10)
Transaction Script / Domain Model Transaction Script Domain Model EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (11)
Modellering EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (12)
Eksempel 1 shipmentaddress Catalog Distributor ContactInformation * Customer * 1 1 ProductCategory 0..1 0..1 * CustomerSale 1 CustomerShipment 1 ProductLine * 1 Brand 0..* 0..* 1 * Order Shipment 1 0..1 1..* 1 * * Product ProductSale OrderLineItem ShipmentLineItem EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (13)
Order-management Customer 1 0..* Order 1..* Product 1 * OrderLineItem EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (14)
Lidt om udviklingsproces EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (15)
Feature-Driven Development Opstart Iteration Iteration Udvikle domæne model Lav feature liste Planlæg iterationer baseret på feature liste Design feature Implementer feature Design package Bruger nyttig funktion Feature: <aktion> <resultat> <objekt> Beregn total-ordre-sum for en kunde EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (16)
Patterns til strukturering af domænemodeller EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (17)
Domain-Driven Design (DDD) Der er mange måder at realisere en domænemodel på DDD beskriver et sæt patterns Entity ValueObject Repository Specification EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (18)
Entity Objekt, som er entydigt identificeret ved et ID Sammenlignes ikke ved at sammenligne værdierne af objekternes attributter Har som regel lang levetid Eksempler: Product Customer Order EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (19)
ValueObject ValueObject er har ikke et entydigt ID Sammenlignes vha. objekternes attributter Beskriver entiteter Bør være immutable Eksempel: OrderLine EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (20)
Entity & ValueObject <<Entity>> Customer 1 0..* <<Entity>> Order 1 1..* <<Entity>> Product 1 * <<ValueObject>> OrderLineItem EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (21)
Specification Udtrykker en forretningsregel (som et objekt) Typer af anvendelser Query Validering interface ISpecification <T> { bool IsSatisfiedBy(T domainobject); class GoldCustomerSpecification : ISpecification<Customer> { public bool IsSatisfiedBy(Customer acustomer) { return acustomer.totalorderamount > 10000? true : false; EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (22)
Repository Repository sørger for at hente/gemme Entities & ValueObjects fra databasen. Repository interfacet minder om Collection Giver illusionen af at alle objekter er i RAM Skjuler al database-kode fra klienten Eksempler: CustomerRepository OrderRepository EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (23)
Repository eksempel CustomerRepository <<Entity>> Customer 1 0..* ProductRepository <<Entity>> Order 1 OrderRepository 1..* <<Entity>> Product 1 * <<ValueObject>> OrderLineItem EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (24)
En note om Persistens Problemet med domænemodeller er mapningen til RDBMS Overvej at bruge et ORM værktøj NHibernate er Open Source (Beta!) PoEAA indeholder relevante patterns, hvis man selv vil skrive mapningen EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (25)
Eksempler på implementation EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (26)
OrderLineItem = ValueObject = POCO class OrderLineItem { int quantity; Product product; float price; public OrderLineItem(Product product, int quantity, float price){ this.product = product; this.quantity = quantity; this.price = price; public int Quantity { get { return quantity; public Product Product { get { return product; public float Price { get {return price; EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (27)
Order = Entity = POCO class Order { Customer customer; List<OrderLineItem> lineitems; public Order(Customer customer) { this.customer = customer; lineitems = new List<OrderLineItems>(); public void AddLineItem(OrderLineItem li) { lineitems.add(li); public void RemoveLineItem(OrderLineItem li) {lineitems.remove(li); public IList<OrderLineItem> LineItems { get {return lineitems; public float TotalPrice { get { float result = 0; foreach (OrderLineItem li in lineitems) { result += li.price; return result; EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (28)
Repository public interface IRepository<T> { void Add(T newelement); void Remove(T element); void Remove(int oid); T FindByOID(int oid); IList<T> Select(ISpecification<T> spec); public class AbstractRepository: IRepository<T> { public class CustomerRepository: AbstractRepository<Customer> { public class OrderRepository : AbstractRepository<Order> { public class ProductRepository : AbstractRepository<Product> { EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (29)
Specification interface ISpecification <T> { bool IsSatisfiedBy(T domainobject); class GoldCustomerSpecification : ISpecification<Customer> { public bool IsSatisfiedBy(Customer acustomer) { return acustomer.totalorderamount > 10000? true : false; public interface IRepository<T> { void Add(T newelement); void Remove(T element); void Remove(int oid); T FindByOID(int oid); IList<T> Select(ISpecification<T> spec); EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (30)
Specification interface ISpecification <T> { bool IsSatisfiedBy(T domainobject); bool SupportsDbQuery { get; string QueryString { get; abstract class Specification<T> : ISpecification<T> { string querystring; Specification(string querystring) {this.querystring = querystring; abstract bool IsSatisfiedBy(T domainobject); string QueryString { get {return querystring; bool SupportsDbQuery { get {return querystring==null? false : true class GoldCustomerSpecification : Specification<Customer> { GoldCustomerSpecification() : base( ) { public override bool IsSatisfiedBy(Customer acustomer) { return acustomer.totalorderamount > 10000? True : false; EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (31)
Typisk brug // Opret ny ordre Order neworder = new Order(); neworder.addlineitem(new OrderLineItem(aProduct, 5, 500.00)); OrderRepository orderrepository = new OrderRespository(); orderrepository.add(neworder); // Find alle guldkunder CustomerRespository customerrepository = new CustomerRepository(); IList<Customer> goldcustomers = customerrepository.select(new GoldCustomerSpecification()); // Check om en given kunde er en guldkunde Customer mycustomer = ; if (new GoldCustomerSpecification().IsSatisfiedBy(myCustomer)) { EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (32)
SO(A) og domænemodeller EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (33)
Kontekst Servicelag Domænemodel Data-adgang EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (34)
Teknologi neutral ~ Teknologi specifik Service TechnologyServices ProductWebService ProductMQService SalesWebService SalesRemotingService DomainServices ProductService SalesService DomainModel CustomerRepository <<Entity>> Customer 1 0..* ProductRepository <<Entity>> Order 1 OrderRepository 1..* <<Entity>> Product 1 * <<ValueObject>> OrderLineItem EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (35)
Domænemodel fordele/ulemper Fordele God til at håndtere komplekse problemområder Skalerer til meget store kodebaser Fælles sprog mellem udviklere og domæne-eksperter Behersker man først domænemodeller, laver man sjælden løsninger baseret på andre strategier Ulemper Tidskrævende at mappe mellem den objektorienteredemodel og det relationellemodel, hvis man ikke har de rigtige værktøjer (f.eks. ORM) Høj indlæringskurve - kræver disciplineret tilgang EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (36)
Referencer Patterns of Enterprise Application Architecture Martin Fowler Addison-Wesley ISBN 0-321-12742-0 Domain-Driven Design Eric Evans Addison-Wesley ISBN 0-321-12521-5 Feature-Driven Development Stephen R. Palmer & John Felsing Prentice Hall ISBN 0-13-067615-2 Java Modeling in Color with UML Peter Coad et.al. Prentice Hall ISBN 0-13-011510-x www.patternshare.org EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (37)
Kontaktinformation Kim Harding Christensen khc@eos.dk EOS A/S Margrethepladsen 3 8000 Århus TLF: 8732 8787 http://www.eos.dk JAOO 2005 25. 30. September Århus http://www.jaoo.dk EOS A/S Margrethepladsen 3 8000 Århus 8732 8787 http://www.eos.dk (38)