1. Presentation
REST
Application (thin and no biz logic!)
Server API Client
Domain (core, biz logic)
Factory Repository Entity/VO Aggregate
Infrastructure
Persistence Push, Mail … Report, Print…
CLI HTML
2. Entity
• An object is distinguished by its identity.
• Aggregate root must be an entity.
• Eg: PhoneItem, User, Order, LineItem
3. Value Object
• No identity.
• Only care about attributes
• Immutable.
• Eg: UserProfile, OrderAddress
7. Caching
• Presentation Layer
Reduce data format conversion time
• Service (App Layer/Domain Layer)
Reduce multiple infrastructure layer cache hits
• Infrastructure
Reduce hits on actual persistence service (eg: MySQL)
8. Cache-Presentation
GET /orders/{orderId}
order_json = cache.get(“/order/#{orderId}”)
if order_json?
order_response = app.get_order_by_id(orderId)
cache.set(“/order/#{orderId}”, convert_to_json(order_response))
{
“userId”: “123abc”,
“id”: “order001”,
“lineItems”: […], #two line items
“address”: {…}
}
POST /orders/{orderId}/lineitems/ #add a new item to the order
{
“id”: “order001”,
“phoneItemIds”: [“e5ab0134b”]
}
order = app.add_line_items(“order001”, “e5ab0134b”)
cache.set(“/order/#{orderId}”, to_json(order))
9. Cache-Service
app.get_order_by_id(id)
order_response = cache.get(“get_order_by_id_#{id}”)
if order_response.nil?
order = order_repository.find_by_id(id)
#convert order to order_response
cache.set(“get_order_by_id_#{id}”, order_response)
return order_response
app.app.add_line_items(order_id, phone_item_id)
order = order_repository.find_by_id(id)
phone_item = phone_item_repository.find_by_id(phone_item_id)
order_item = order.add_line_item(phone_item)
order = order_repository.store(order)
#convert order to order_response
cache.set(“get_order_by_id_#{id}”, order_response)
return order_response
10. Cache-Infrastructure
order_access.select_by_id(id)
data = cache.get(“select_order_data_by_id_#{id}”)
if data.nil?
#retrieve from persistence media (eg: mysql)
cache.set(“select_order_data_by_id_#{id}”, data)
lineitem_access.select_by_order_id(id)
data = cache.get(“select_lineitem_data_by_order_id_#{id}”)
if data.nil?
#retrieve from persistence media (eg: mysql)
cache.set(“select_lineitem_data_by_order_id_#{id}”, data)
lineitem_access.insert(line_item_data)
#insert line_item_data into persistence media (eg: mysql)
cache.clean(“select_lineitem_data_by_order_id_#{line_item_data.order_id}”)
11. Model vs Module
• Domain model is inventory.
• Ordering is sub domain model
• User, PhoneItem and Order are modules in ordering
domain model.