Posts Tagged ‘ddd’

Domain Types – Interfaces

Tuesday, November 24th, 2009

In the last post, I published the DomainTypes library: a set of .NET interfaces & base classes to provide the building blocks for DDD (source code included).

In this post I’ll describe the interfaces and supporting design decisions.

IDomainObject

Represents any type of object within the Domain model. Currently this is simply used as a marker, signalling to developers that the implementation has DDD semantics.

IEntity

Represents a unique Entity within the system.  The ID property is used to identify the instance during it’s lifetime.  Using a GUID allows identity to be established without having to talk to a persistence store (i.e. database).

IValueObject

Represents a non-unique object within the system.  Note that it’s an object, and not a struct.  Structs may seem like a better semantic fit with DDD, but too many instances can cause memory problems (structs – like value types – are created on the stack).

The Clone() method is used to create copies.  The implementing class can decide whether to create new instances, or use the FlyWeight pattern.

IList<T>

Represents a list of Domain Objects.  It’s crucial that the implementing class raises events before items are added or removed from the list.  This allows consumer code to execute any domain rules, and cancel the action if necessary.

IEvent

This is one that Eric Evans mentioned earlier this year.  It is used to record & identify domain events, and must be immutable. For example, a child’s birth should be captured, be identifiable, but never modified.

IAggregateRoot

Most people understand Aggregate Roots as a cluster of closely associated entities.  However, there are 2 additional concerns that an Aggregate Root has:

  1. It knows how to validate the entire aggregate
  2. It is used to lock it’s contents in a multi-user environment

The IsConsistent() method is a placeholder for all rules/invariants that apply to the aggregate.  The locking concerns are handled by IRepository<T> (see below).

IFactory<T>

Used to create Domain Objects/Entities/Aggregate Roots that are complex to build.  Only use factories when the code within your constructors becomes unweildy.

IRepository<T>

Used as a facade to a persistence store.  Strictly speaking, repositories should only deal with Aggregate Roots – to access other entities you would navigate through the Aggregate.

In addition to the typical Load()/Save()/Delete() methods, I’ve also included Lock() and Unlock() methods.  This is a crucial function in a multi-user system, and should be considered when designing your Aggregates.

IService

Currently this is simply used as a marker.  Only consider using Services if :

  1. Try as you might, you can’t decide on which Domain Object to place your logic
  2. The logic requires the use of several unassociated Domain Objects
  3. You’re communicating with another module/tier/component

The remaining interfaces aren’t DDD specific, but are to aid real-world implementations.  I’ll discuss those in the near future.

Download the source code

Eric Evans: “What I’ve learned about DDD since the book”

Tuesday, June 30th, 2009

Eric Evans talks about the most essential parts of his book, having practiced it over the last 5 years.

One of the topics that caught my attention was Exploration and Experimentation (3m 25s into the video).  Evans suggests that teams should be exploring & experimenting even after a useful domain model is created.  His quote:

What are the odds that [the first good model] is the best you could have done?

So why aren’t teams doing this already?  Typically, it’s because of fear and cost of change. Traditionally, software has never been easy to change (read expensive).  And for all of the new technology being spewed out, not all of it is designed to make change easy.

This is the void that TrueView attempts to address.  It’s not about UI design, or database design, or Web Service contracts.  It’s about creating interactive domain models that Domain Experts and Software Experts can explore, discuss, and help refine the ubiquitous language.

If you haven’t tried it already, you can download it here. I hope you find it useful.

Tips for Domain Driven Design and TrueView

Tuesday, June 2nd, 2009

Here are some tips for DDD newbies.  It’s easy to fall back to doing ‘what you know best’, so use these tips to stay focused. Hopefully your design skills will get better (and faster) as a result. :)

  1. Don’t start with the User Interface
    Instead of asking “How will the user solve this problem?“, ask “What is the problem?
  2. Design Domain Models, not database schemas
    Most business users don’t understand database schemas – so don’t make them
  3. Design your Domain Model incrementally
    Defining too much detail early on is the fastest way to get side-tracked
  4. Get constant feedback from your Domain Experts
    Take advantage of TrueView’s auto-generated prototypes to get instant feedback
  5. Separate business concerns from technical concerns
    Writing technical infrastructure code can be counter-productive during the modelling phase
  6. Unit testing wisely
    Focus on testing non-trivial behaviour and complex business logic, possibly using BDD
  7. Think agile, be agile
    Your clients don’t have time to wait, so don’t make them

You can read the detailed version here.

A quick chat with Eric Evans

Thursday, March 26th, 2009

Eric Evans chatted with Alex Handy (SDTimes) about the primary aspects of DDD.  Read the interview here.

The BBC uses Domain Driven Design

Tuesday, March 24th, 2009

A little late :oops: , but still relevant…

Michael Smethurst (Information Architect at the BBC) describes how DDD is used to make websites.