ddd-4-java - domain-driven design (ddd) for java

7
ddd-4-java - Domain-Driven Design (DDD) for Java Base classes for Domain Driven Design (DDD) with Java AggregateRoot / Entity / Repository / Event / … Small (Only ~50 Interfaces / Classes) Event Store Interface Event Store Implementation for a relational database Open Source https://github.com/fuinorg/ddd-4-ja va LGPL License

Upload: michael-schnell

Post on 15-Jun-2015

270 views

Category:

Software


1 download

DESCRIPTION

Describes how to create DDD objects using https://github.com/fuinorg/ddd-4-java

TRANSCRIPT

Page 1: ddd-4-java  -  Domain-Driven Design (DDD) for Java

ddd-4-java - Domain-Driven Design (DDD) for Java

Base classes for Domain Driven Design (DDD) with Java

AggregateRoot / Entity / Repository / Event / …

Small (Only ~50 Interfaces / Classes)

Event Store Interface

Event Store Implementation for a relational database

Open Source https://github.com/fuinorg/ddd-4-java LGPL License

Page 2: ddd-4-java  -  Domain-Driven Design (DDD) for Java

ddd-4-java – Vendor Example

Vendor [AggregateRoot]• VendorRef ref // VendorId + VendorKey + VendorName• Person person

Person [Entity]• PersonId id• PersonName name

CreateVendor

ChangeVendorName

AddPerson

ChangePersonNameChangeName

RemovePerson

Page 3: ddd-4-java  -  Domain-Driven Design (DDD) for Java

ddd-4-java – CreateVendor: Aggregate

public class Vendor extends AbstractAggregateRoot<VendorId> {

private VendorRef ref;

:

}

Extend AbstractAggregateRoot

No public getters

Page 4: ddd-4-java  -  Domain-Driven Design (DDD) for Java

ddd-4-java – CreateVendor: Constructor

public Vendor(@NotNull VendorId id, @NotNull VendorKey key, @NotNull VendorName name, @NotNull ConstructorService service) throws DuplicateVendorKeyException { // CHECK PRECONDITIONS Contract.requireArgNotNull("id", id); Contract.requireArgNotNull("key", key); Contract.requireArgNotNull("name", name); Contract.requireArgNotNull("service", service);

// VERIFY BUSINESS RULES - Normally a validator (not a service) service.addVendorKey(key);

// HANDLE EVENT apply(new VendorCreatedEvent(new VendorRef(id, key, name)));}

No state change in a constructor or method(Only allowed in a @EventHandler method)

Calls the “handle(..)” method

michi
Page 5: ddd-4-java  -  Domain-Driven Design (DDD) for Java

ddd-4-java – CreateVendor: Constructor

public class Vendor extends AbstractAggregateRoot<VendorId> {

private VendorRef ref; :

@EventHandler private void handle(VendorCreatedEvent event) { this.ref = event.getVendorRef(); } :

}No exceptions in the “handle(..)” method

Invoked from AbstractAggregateRoot

Page 6: ddd-4-java  -  Domain-Driven Design (DDD) for Java

ddd-4-java – CreateVendor: Unit Test

@Testpublic void testConstructor() throws DuplicateVendorKeyException { // PREPARE VendorId id = new VendorId(UUID.randomUUID()); VendorKey key = new VendorKey("V00001"); VendorName name = new VendorName("Peter Parker Inc."); ConstructorService service = new ConstructorService() { public void addVendorKey(VendorKey key) throws DuplicateVendorKeyException { // Do nothing } }; // TEST Vendor vendor = new Vendor(id, key, name, service); // VERIFY List<DomainEvent<?>> events = vendor.getUncommittedChanges(); assertThat(events).hasSize(1); assertThat(events.get(0)).isInstanceOf(VendorCreatedEvent.class); :}

Page 7: ddd-4-java  -  Domain-Driven Design (DDD) for Java

ddd-4-java – To be continued…

TO BE CONTINUED…