Domain Driven Design Implementation Patterns and Considerations in.NET.
-
Upload
aubrey-hubbard -
Category
Documents
-
view
226 -
download
0
Transcript of Domain Driven Design Implementation Patterns and Considerations in.NET.
![Page 1: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/1.jpg)
Phill
y!
Domain Driven Design
Implementation Patterns and Considerations in .NET
![Page 2: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/2.jpg)
Phill
y!Who am I?• …and why should you care?• Steve Bohlen• I Read Books + Write Software• vs. “Read Software + Write Books”
• Blog, Screencast, Speak, Share, Learn
![Page 3: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/3.jpg)
Phill
y!Nearly 20 years developing softwareLISP, Delphi, C/C++, VB, VB.NET, C#Co-Founder, NYC Alt.Net User Group
http://nyalt.netContributor: various OSS projects
http://www.summerofnhibernate.comblog: http://blog.unhandled-exceptions.come-mail: [email protected]: @sbohlen
![Page 4: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/4.jpg)
Phill
y!VirtualAlt.Net• Meets weekly (monthly?)• 9:00pm EST• Livemeeting-based• http://www.virtualaltnet.com• Alt.NET Topics• Past Speakers:– Ayende (Oren Eini)– Jeremy Miller– Lesser-known people (like myself)
![Page 5: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/5.jpg)
Phill
y!NYC CodeCamp• March 6th , 2010• Registration opens February 8th (Monday!)• http://nyc.codecamp.us• Alt.NET –focused topics– Sharepoint and Silverlight too (if you‘re into that!)
• Come heckle Rachel Appel (the new NYC-area MS Developer Evangelist)
![Page 6: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/6.jpg)
Phill
y!
http://tinyurl.com/badnay
![Page 7: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/7.jpg)
Phill
y!
http://tinyurl.com/b55f6q
![Page 8: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/8.jpg)
Phill
y!
http://tinyurl.com/ykv4tfhttp://tinyurl.com/58yf3k
![Page 9: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/9.jpg)
Phill
y!
Beta Presentation
![Page 10: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/10.jpg)
Phill
y!
Opinions Ahead
![Page 11: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/11.jpg)
Phill
y!Agenda• Concepts Behind DDD (as needed)• Implementation Patterns and Concerns for DDD Model
Building Blocks in C#• General DDD Coding Anti-Patterns• Domain Entities• Domain Value Objects• Domain Repositories• Domain Services• Domain Validation
• Discussion
![Page 12: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/12.jpg)
Phill
y!Common DDD Coding Anti-Patterns• DDD Constructs with ‘type-suffixes’
• ‘Types’ are ‘roles’ in the Domain Model• Not…
• CustomerEntity• AddressValueObject• CustomerRepository• ShippingService• OverdueOrderSpecification
• Repository as glorified DAL• repository.Get(int id)• repository.Save(Customer c)• repository.Delete(Customer c)• repository.Update(Customer c)
![Page 13: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/13.jpg)
Phill
y!
Entities
![Page 14: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/14.jpg)
Phill
y!Coding DDD Entities Distilled• Identity Equality
– Objects are just reference-equal by default in .NET– Equals, GetHashCode, IEquatable<T>
• Identity Comparison
• Control of Access to Children Objects within the aggregate– Customer.AddOrder(theOrder);, Customer.RemoveOrder(theOrder);
– Not Customer.Orders.Add(theOrder);
• Infrastructure-Ignorant– Persistent-Ignorant, UI-Ignorant, etc.
![Page 15: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/15.jpg)
Phill
y!Challenges with DDD Entities• Do we expose Identity value as a property?– Isn’t that a persistence-concern?– Providing a setter means the ‘identity’ of my entity
can be changed by something external to it (bad!)• Are General Property Setters/Getters a smell?– Means your domain is trending towards DTO-hell– Entities as property-containers for data– Non-Meaningful names for things!
![Page 16: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/16.jpg)
Phill
y!
Exploring Entities in Code
![Page 17: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/17.jpg)
Phill
y!
Value Objects
![Page 18: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/18.jpg)
Phill
y!Coding DDD Value Objects Distilled• Immutable– After construction, no changes to the object– Read-Only Properties
• Value-Equality– Equals, GetHashCode, IEquatable<T>
• Property-by-Property comparison!
![Page 19: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/19.jpg)
Phill
y!Challenges with DDD Value Objects• Tedious to write boilerplate IEquatable<T>
implementation code by hand every time• If immutable, how do we modify one?– Not entirely a trick question
• If no identity, how do we persist them????– Deconstruction into basic data types?
![Page 20: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/20.jpg)
Phill
y!
Exploring Value Objects in Code
![Page 21: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/21.jpg)
Phill
y!
Repositories
![Page 22: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/22.jpg)
Phill
y!Coding DDD Repositories Distilled• Domain Model not tied to specific Persistence• Abstract the act of query/retrieval• Do so in a Domain-Centric Way– (CustomerRepository.GetById(int id) is NOT
domain-centric!)• This is a data-access-layer suffixed with ’Repository’!
![Page 23: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/23.jpg)
Phill
y!Challenges with DDD Repositories• If no persistence in the Domain Model, how do we reference
repositories in there?– Abstraction/indirection
• Repository Boundary blurring– OK for query constructs to come from outside?
• repos.GetBySpecification(Specification spec);
– OK for Specification to be tied to implementation?• repos.GetByCriteria(DetachedCriteria crit);
– OK for lazy-executed queries to be returned?• public IQueryable<Customer> GetCustomers()
• Guarding against Repository API-bloat– The repository is dead, long live the repository!
![Page 24: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/24.jpg)
Phill
y!
Exploring Repositories in Code
![Page 25: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/25.jpg)
Phill
y!
Services
![Page 26: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/26.jpg)
Phill
y!Coding DDD Services Distilled• Actions/Behaviors not belonging in Entities• Injected into Entities (?)• Operating Autonomously from Entities
![Page 27: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/27.jpg)
Phill
y!Challenges with DDD Services• Is having Services just to inject into Entities an anti-
pattern?Order order = new Order(taxservice);double cost = Order.TotalWithTax();
• If Services coordinate Entity interaction, who news-up the service?
• Having all behavior expressed in Services and none in Entities is an anti-pattern– Or is it? And why?
![Page 28: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/28.jpg)
Phill
y!
Exploring Services in Code
![Page 29: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/29.jpg)
Phill
y!
Validation
![Page 30: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/30.jpg)
Phill
y!Coding DDD Validation Distilled• Validation is often a stand-in for ‘business rules’
– bool CanShipOrder();
• Distinguish between persistence validation and business action validation– Rarely the same thing!
• Entity Validation– Entities can be valid for some things and invalid for others
• Place an order (if valid customer w/ a valid account)• Ship an Order (if valid account and under credit limit)
• Value Object Validation– Prevent VO from entering an invalid state in the first place!
![Page 31: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/31.jpg)
Phill
y!Challenges with DDD Validation• Validation without ‘for what?’ is pointless
– bool IsValid(); //???
• Validation Frameworks tend to assume validation means persistence– Does NOT mean cannot be repurposed for Domain Validation!
• Where does validation happen if it requires collaboration between multiple Entities?– bool order.CanShipTo(customer);– bool customer.CanShip(order);– bool shippingValidator.CanShip(customer, order)– Anemic Domain Model Anti-Pattern?
![Page 32: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/32.jpg)
Phill
y!
Exploring Validation in Code
![Page 33: Domain Driven Design Implementation Patterns and Considerations in.NET.](https://reader036.fdocuments.in/reader036/viewer/2022062421/56649e035503460f94aef35c/html5/thumbnails/33.jpg)
Phill
y!Discussion• Viewpoints• Experiences• Values• More Discussion:– http://www.domaindesign.org – http://tech.groups.yahoo.com/group/
Domaindrivendesign/