Add Some DDD to Your ASP.NET MVC, OK?

41
ADD SOME DDD TO YOUR ASP.NET MVC, OK? STEVE SMITH CTO, FALAFEL SOFTWARE @ARDALIS | [email protected]

description

Improve the design of your ASP.NET MVC Solution by applying some principles and best practices from Domain-Driven Design.

Transcript of Add Some DDD to Your ASP.NET MVC, OK?

Page 1: Add Some DDD to Your ASP.NET MVC, OK?

ADD SOME DDDTO YOUR

ASP.NET MVC, OK?STEVE SMITH

CTO, FALAFEL SOFTWARE

@ARDALIS | [email protected]

Page 2: Add Some DDD to Your ASP.NET MVC, OK?

WHAT IS DOMAIN-DRIVEN DESIGN (DDD)?

Page 3: Add Some DDD to Your ASP.NET MVC, OK?
Page 4: Add Some DDD to Your ASP.NET MVC, OK?

Communication

• Ubiquitous Language

• Domain Expert Interaction

Modeling

• Core Domain

• Generic Subdomains

• Bounded Context

• Context Map

• Shared Kernel

• Anti-Corruption Layer

Implementation

• Model-Driven Design

• Layered Architecture

• Entities

• Value Objects

• Services

• Factories

• Aggregates

• Repositories

• Domain Events

Page 5: Add Some DDD to Your ASP.NET MVC, OK?

DDD IS BIG

“THE MORE YOU KNOW, THE MORE YOU REALIZE YOU KNOW

NOTHING.”

SOCRATES

Page 6: Add Some DDD to Your ASP.NET MVC, OK?

DDD FUNDAMENTALS COURSE

• OVER 4 HOURS OF CONTENT (DEMOS USING MVC + SIGNALR)

• HTTP://BIT.LY/PS-DDD

Page 7: Add Some DDD to Your ASP.NET MVC, OK?

DDD BENEFITS

• FLEXIBILITY

• SOFTWARE MODELS CUSTOMER’S

UNDERSTANDING OF PROBLEM

• BREAKS COMPLEXITY INTO MANAGEABLE

PIECES

• Well-organized; easily tested

• Business logic lives in one place

Page 8: Add Some DDD to Your ASP.NET MVC, OK?

DDD DRAWBACKS

• TIME AND EFFORT

• LEARNING CURVE

• OVERKILL WITHOUT COMPLEXITY

• “ANEMIC” DOMAIN MODEL PROBLEM

Page 9: Add Some DDD to Your ASP.NET MVC, OK?

COMMUNICATION

“AS SOFTWARE DEVELOPERS, WE FAIL IN TWO WAYS: WE BUILD THE

THING WRONG, OR WE BUILD THE WRONG THING.”

ME

Page 10: Add Some DDD to Your ASP.NET MVC, OK?
Page 11: Add Some DDD to Your ASP.NET MVC, OK?

UBIQUITOUS LANGUAGE

http://upload.wikimedia.org/wikipedia/commons/2/23/Rosetta_Stone.JPG

Page 12: Add Some DDD to Your ASP.NET MVC, OK?

LANGUAGE

“A PROJECT FACES SERIOUS PROBLEMS WHEN ITS LANGUAGE IS

FRACTURED.”

ERIC EVANS

Page 13: Add Some DDD to Your ASP.NET MVC, OK?

UBIQUITOUS LANGUAGE

• UBIQUITOUS – ADJECTIVE. PRESENT, APPEARING, OR FOUND EVERYWHERE.

• SYNONYMS: PERVASIVE, UNIVERSAL

• USED WITHIN A GIVEN BOUNDED CONTEXT

• USED IN CODE, DESIGN DOCUMENTS, AND CONVERSATIONS

-- EVERYWHERE

Page 14: Add Some DDD to Your ASP.NET MVC, OK?

DOMAIN TERMS

Domain Experts

Problem Domain

Core Domain

Sub-Domains

Page 15: Add Some DDD to Your ASP.NET MVC, OK?

BOUNDED CONTEXTS

• PROVIDE SEPARATION OF CONCERNS

• LIMIT COMPLEXITY

• SHOULD BE CLEARLY BOUNDED AND SEPARATE

Page 16: Add Some DDD to Your ASP.NET MVC, OK?

Appointment Scheduling Billing

Page 17: Add Some DDD to Your ASP.NET MVC, OK?

Appointment Scheduling Billing

Anti-

Corruption

Layer

Page 18: Add Some DDD to Your ASP.NET MVC, OK?

MODEL DRIVEN DESIGN

NOT DATA-DRIVEN

Page 19: Add Some DDD to Your ASP.NET MVC, OK?

LAYERED ARCHITECTURE

• PORTS AND ADAPTERS

• HEXAGONAL

• ONION

Page 20: Add Some DDD to Your ASP.NET MVC, OK?

ORGANIZING IN A SOLUTION

Page 21: Add Some DDD to Your ASP.NET MVC, OK?

ENTITIES

“MANY OBJECTS ARE NOT FUNDAMENTALLY DEFINED BY THEIR

ATTRIBUTES, BUT RATHER BY A THREAD OF CONTINUITY AND IDENTITY.”

ERIC EVANS

Page 22: Add Some DDD to Your ASP.NET MVC, OK?

CHANGING ATTRIBUTES DOESN’T CHANGE WHICH ONE WE’RE TALKING ABOUT

ID:1

• Name: Steve Smith

• Twitter: @ardalis

• Favorite Color: Blue

ID: 1

• Name: Steven Smith

• Twitter: @ardalis

• Favorite Color: Blue

ID: 1

• Name: Steven Smith

• Twitter: @ardalis

• Favorite Color: Orange

Page 23: Add Some DDD to Your ASP.NET MVC, OK?
Page 24: Add Some DDD to Your ASP.NET MVC, OK?
Page 25: Add Some DDD to Your ASP.NET MVC, OK?

VALUE OBJECTS

• DEFINED BY THEIR ATTRIBUTES

• IMMUTABLE

• SHOULD HAVE NO SIDE EFFECTS

• EXAMPLES: STRINGS, ADDRESSES, CURRENCY

Page 26: Add Some DDD to Your ASP.NET MVC, OK?
Page 27: Add Some DDD to Your ASP.NET MVC, OK?

Immutable!

Page 28: Add Some DDD to Your ASP.NET MVC, OK?

DOMAIN SERVICES

• NOT A NATURAL PART OF AN ENTITY OR VALUE OBJECT

• INTERFACE DEFINED IN TERMS OF OTHER MODEL ELEMENTS

• SHOULD BE STATELESS (BUT MAY HAVE SIDE EFFECTS)

Page 29: Add Some DDD to Your ASP.NET MVC, OK?

SERVICES IN DIFFERENT LAYERS

UI Layer& Application Layer

InfrastructureDomain(“Application Core”)

Message Sending

Message Processing

XML Parsing

UI Services

Transfer Between Accounts

Process Order

Send Email

Log to a File

Page 30: Add Some DDD to Your ASP.NET MVC, OK?

DOMAIN EVENTS

“USE A DOMAIN EVENT TO CAPTURE AN OCCURRENCE OF SOMETHING

THAT HAPPENED IN THE DOMAIN.”

VAUGHN VERNON

IMPLEMENTING DOMAIN-DRIVEN DESIGN

Page 31: Add Some DDD to Your ASP.NET MVC, OK?

DOMAIN EVENT TIPS

• CONSIDER FOR CASES OF “WHEN THIS HAPPENS, THEN…”

• OR “NOTIFY SOMEONE WHEN…”

• DOMAIN EVENTS REPRESENT THE PAST

• THEY ALREADY HAPPENED

• THUS, THEY SHOULD BE IMMUTABLE

Page 32: Add Some DDD to Your ASP.NET MVC, OK?

EXAMPLES OF DOMAIN EVENTS

User

Authenticated

Appointment

Confirmed

Payment

Received

$¢£¥

Page 33: Add Some DDD to Your ASP.NET MVC, OK?

DESIGNING DOMAIN EVENTS

• EACH EVENT IS A CLASS

• USE A COMMON INTERFACE (E.G. IDOMAINEVENT)

• CAPTURE WHEN THE EVENT TOOK PLACE

• INCLUDE DETAILS

• WHAT WOULD YOU NEED TO KNOW TO TRIGGER THIS EVENT AGAIN?

• INCLUDE IDENTITIES OF ANY ENTITIES INVOLVED

• INITIALIZE ALL STATE IN CONSTRUCTOR

• NO BEHAVIOR OR SIDE EFFECTS – JUST STATE

Page 34: Add Some DDD to Your ASP.NET MVC, OK?

MORE DDD TOPICS

• AGGREGATES

• REPOSITORIES

• FACTORIES

Learn More:

DDD Fundamentals on Pluralsight

Eric Evans’ DDD Book

Email: [email protected]

Page 35: Add Some DDD to Your ASP.NET MVC, OK?

DOMAIN MODELS AND MVC MODELS

• UI INTERACTS DIRECTLY WITH DOMAIN MODEL

• ENTITIES, VALUE OBJECTS

• INTERFACES, SERVICES

• VIEWS MAY WORK WITH CUSTOM VIEWMODELS

• CLIENT (HTML/JS) CODE MAY USE ANOTHER (CLIENT-SIDE) VIEWMODEL AS WELL

Page 36: Add Some DDD to Your ASP.NET MVC, OK?

CONTROLLERS

• KEEP AS SMALL AS POSSIBLE

• ELIMINATE BUSINESS LOGIC

• INJECT ALL DEPENDENCIES

• HTTP://DEVIQ.COM/EXPLICIT-DEPENDENCIES-PRINCIPLE

Page 37: Add Some DDD to Your ASP.NET MVC, OK?

VIEWS

• NO LOGIC UNLESS ENCAPSULATED IN TESTED HELPERS

• NO BUSINESS LOGIC IF IT CAN INSTEAD BE MODELED IN THE DOMAIN

Page 38: Add Some DDD to Your ASP.NET MVC, OK?

SIGNALR

• AWESOME ADDITION TO ASP.NET

• GREAT FOR NOTIFICATIONS TO MULTIPLE USERS

• TIES IN EASILY WITH DOMAIN EVENTS

• EVENT HANDLERS CAN BE ADDED TO UI PROJECT

Page 39: Add Some DDD to Your ASP.NET MVC, OK?

SOLUTION STRUCTURE

• CORE

• INTERFACES

• MODEL (ENTITIES, VALUE OBJECTS)

• DOMAIN SERVICES

• INFRASTRUCTURE

• DBCONTEXT

• FILE ACCESS

• SYSTEM CLOCK ACCESS

• EMAIL SERVICES

• WEB

• MVC PROJECT

• NO DIRECT USE OF INFRASTRUCTURE

Page 40: Add Some DDD to Your ASP.NET MVC, OK?

DEMOPUTTING DDD INTO ASP.NET MVC

Page 41: Add Some DDD to Your ASP.NET MVC, OK?

Lea

rn M

ore

: