applying domain-driven design

23
Applying Domain-Driven Design Jimmy Nilsson www.jnsk.se/weblog/ Webcast with Webcast with UML China UML China 2006-08-30 2006-08-30

Upload: weston

Post on 25-Feb-2016

26 views

Category:

Documents


1 download

DESCRIPTION

Applying Domain-Driven Design. Webcast with UML China 2006-08-30. Jimmy Nilsson www.jnsk.se/weblog/. About Jimmy Nilsson. Primarily a developer, but also a trainer and author Blogs at www.jnsk.se/weblog/ - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Applying Domain-Driven Design

Applying Domain-Driven Design

Jimmy Nilssonwww.jnsk.se/weblog/

Webcast with Webcast with UML China UML China 2006-08-302006-08-30

Page 2: Applying Domain-Driven Design

About Jimmy Nilsson• Primarily a developer, but also a

trainer and author• Blogs at www.jnsk.se/weblog/• Author of Applying Domain-Driven

Design and Patterns and .NET Enterprise Design

Page 3: Applying Domain-Driven Design

Main Focus of DDD?

• The core is the main focus!• Forget distractions!

Page 4: Applying Domain-Driven Design

?1

Relationaldatabase

Page 5: Applying Domain-Driven Design

Why DDD?

Why DDD?Knowledge-rich design

Mappingto domain

Reduced complexity

Testability

Maintainability

Etc, etc...

Page 6: Applying Domain-Driven Design

Problem Description

• A complex, large scale and long lived order application will be built

• Some very simple examples of requirements:• Order has a customer, customer has orders• Order has one or more lines• Order has a value• Customer has address• ...

Page 7: Applying Domain-Driven Design

Transaction Script [PoEAA]

+RunScript1()+RunScript2()

TransactionScriptA

+Run()

TransactionScript

+Run()

ConcreteTransactionScriptA

+Run()

ConcreteTransactionScriptB

Page 8: Applying Domain-Driven Design

Table Module [PoEAA]

+Process1(in id)+Process2()

TableModule RecordSet

1

Page 9: Applying Domain-Driven Design

Domain Model [PoEAA]

1

Page 10: Applying Domain-Driven Design

Because of the problem description, we choose Domain Model

Now we need a Domain Model style...

Page 11: Applying Domain-Driven Design

Entities [DDD]+CustomerId+Name+AverageSalesVolume+ProductCategory

Customer

+SalesRepresentative+Priority+ContactPhone+ContactAddress

SalesContact

1

1

+CustomerId+Name+ContactPhone+ContactAddress

Customer

+SalesRepresentative+Priority

SalesContact

1

1

+AverageSalesVolume+ProductCategory

BusinessLine

1 1

Page 12: Applying Domain-Driven Design

Value Objects [DDD]

+CustomerId+Name+Street+City+State

Customer+CustomerId+Name

Customer

+Street+City+State

Address

1

1

Page 13: Applying Domain-Driven Design

Aggregates [DDD]

«Aggregate Root»Car

«Aggregate Root»Engine

Customer

Wheel

TirePosition

1

41

4

*

Page 14: Applying Domain-Driven Design

Repositories [DDD]

client repository database

selection criteriamatching objects Delegate

Page 15: Applying Domain-Driven Design

Factories [DDD]

client FACTORY product

new(parameters)product Create

Page 16: Applying Domain-Driven Design

What problems remain?

• Infrastructure...

• Assumption 1: Relational database• How?• Assumption 2: O/R Mapping• Which?• Assumption 3: For eg NHibernate

Page 17: Applying Domain-Driven Design

NHibernate• Domain Model style: POCO / Persistent Ignorant (PI)• Mapper style: Framework• Start with: Domain Model, Tables, Metadata• API-Focus: Domain Model• Query language: String-based, Query Object-based• Open source, production version• Many databases are supported• Port of Hibernate 2.0.3• Focus: ”Only” O/R Mapping

Page 18: Applying Domain-Driven Design

Data Mapper [PoEAA]• For example Customer.hbm.xml

<class name="Customer" table="Customers"><id name="Id" access="field">

<unsaved-value= "00000000-0000-0000-000000000000”> <generator class="guid.comb" /></id><property name="Name" access="field.camelcase-underscore" />

Page 19: Applying Domain-Driven Design

CRUD – C_session.Reconnect();

try{_session.SaveOrUpdate(customer);

_session.Flush(); }finally{_session.Disconnect();

}

Page 20: Applying Domain-Driven Design

CRUD – R(Customer)_session.Load(typeof(Customer), id);

Page 21: Applying Domain-Driven Design

Summary...

?1

Relationaldatabase

Page 22: Applying Domain-Driven Design

Any Questions?

?

Thanks for listening!

www.jnsk.se/weblog/

Page 23: Applying Domain-Driven Design

References• [DDD] Eric Evans; Domain-Driven Design• [PoEAA] Martin Fowler; Patterns of Enterprise

Application Architecture• [NHibernate] nhibernate.sourceforge.net• [ADDDP] Jimmy Nilsson; Applying Domain-

Driven Design and Patterns