PRESENTATION LAYER
BUSINESS LOGIC LAYER
DATA ACCESS LAYER
Slide 5
Slide 5 text
No content
Slide 6
Slide 6 text
PRESENTATION LAYER
BUSINESS LOGIC LAYER
DATA ACCESS LAYER
Slide 7
Slide 7 text
Transaction Script
Active Record
Domain Model
Event Sourced Domain Model
Slide 8
Slide 8 text
TRANSACTION SCRIPT
Slide 9
Slide 9 text
TRANSACTION SCRIPT
▸ Simple Business Logic
▸ CRUD
▸ Input Validation
▸ Extract Transform Load (ETL)
▸ Simple Data Structures
▸ Always leave the database in a consistent state
Slide 10
Slide 10 text
APPLICATION
CREATE USER UPDATE USER SEARCH USERS
DATABASE
UI
Slide 11
Slide 11 text
public class CreateUser {
public void Execute(name, email) {
try {
DB.StartTransaction();
var row = DB.NewUserRow();
row.Name = name;
row.Email = email;
DB.Append(row);
DB.Commit();
} catch {
DB.Rollback();
throw;
}
}
}
Slide 12
Slide 12 text
ACTIVE RECORD
Slide 13
Slide 13 text
ACTIVE RECORD
▸ Simple Business Logic
▸ CRUD
▸ Input Validation
▸ Extract Transform Load (ETL)
▸ Complex Data Structures
▸ References / Collections
▸ Multiple Tables
Slide 14
Slide 14 text
USER INTERESTS
ID
NAME Has
many
ADDRESS
COUNTRY CITY
STREET
Slide 15
Slide 15 text
APPLICATION
CREATE USER UPDATE USER SEARCH USERS
DATABASE
UI
Slide 16
Slide 16 text
APPLICATION
CREATE USER UPDATE USER SEARCH
USERS
UI
ACTIVE
RECORDS
USER
DATABASE
Slide 17
Slide 17 text
public class CreateUser {
public void Execute(userDetails) {
try {
DB.StartTransaction();
var user = new User();
user.Name = userDetails.Name;
user.Email = userDetails.Email;
user.Save();
DB.Commit();
} catch {
DB.Rollback();
throw;
}
}
}
Slide 18
Slide 18 text
public class User {
public Guid Id { get; set; }
public string Name { get; set; }
public List Interests { get; set; }
public Address Address { get; set; }
public void Save() { … }
public void Delete() { … }
public static User Get(Guid id) { … }
public static List GetAll() { … }
}
Slide 19
Slide 19 text
DOMAIN MODEL
Slide 20
Slide 20 text
DOMAIN MODEL
▸ Complex Business Logic
▸ Business rules
▸ Invariants
▸ Calculations
▸ Complex algorithms
Slide 21
Slide 21 text
APPLICATION
CREATE USER UPDATE USER SEARCH
USERS
UI
ACTIVE
RECORDS
USER
DATABASE
Slide 22
Slide 22 text
APPLICATION
CREATE USER UPDATE USER SEARCH USERS
UI
DOMAIN
MODEL
USER
DATABASE
Slide 23
Slide 23 text
APPLICATION
CREATE USER UPDATE USER SEARCH USERS
UI
DOMAIN
MODEL
USER
INFRASTRUCTURE
Slide 24
Slide 24 text
DOMAIN MODEL
▸ Complex business logic
▸ Model business domain
▸ Objects: data + behavior
▸ Plain objects
▸ Minimal application level use cases
Slide 25
Slide 25 text
public class UpdateUser {
public void Execute(userDetails) {
try {
var user = usersRepository.Get(userDetails.Id);
user.UpdateDetails(userDetails);
usersRepository.Save(user);
} catch {
DB.Rollback();
throw;
}
}
}
Slide 26
Slide 26 text
public class User {
public Guid Id { get; private set; }
public string Name { get; private set; }
public List Interests { get; private set; }
public Address Address { get; private set; }
public void UpdateDetails() { … }
public void AddInterest() { … }
public static User InitializeNew() { … }
}
public interface IUsersRepository {
User Get(Guid id);
void Save(User user);
void Delete(User user);
}
Slide 27
Slide 27 text
APPLICATION
CREATE USER UPDATE USER SEARCH USERS
UI
DOMAIN
MODEL
USER
INFRASTRUCTURE
Slide 28
Slide 28 text
EVENT SOURCED
DOMAIN MODEL
Slide 29
Slide 29 text
EVENT SOURCED DOMAIN MODEL
▸ Complex Business Logic
▸ Business rules
▸ Invariants
▸ Complex algorithms
▸ Deals w/ money
▸ Data analysis required
▸ Audit required by law
Slide 30
Slide 30 text
EVENT SOURCED DOMAIN MODEL
Phone
Email
Name
Id
46464543
one@gmail.com
James
1
34234343
two@gmail.com
John
2
Slide 31
Slide 31 text
public class NewUserInitialized {
public Guid UserId { get; private set; }
public string Name { get; private set; }
public string Email { get; private set; }
}
public class NameChanged {
public Guid UserId { get; private set; }
public string NewName { get; private set; }
}
public class EmailChanged {
public Guid UserId { get; private set; }
public string NewEmail { get; private set; }
}
CQRS - COMMAND QUERY RESPONSIBILITY SEGREGATION
WRITE MODEL
COMMANDS
UI
READ MODEL
QUERIES
Slide 39
Slide 39 text
«SHLIKHTA» ARCHITECTURE
EVERYTHING
Slide 40
Slide 40 text
EVENT SOURCED DOMAIN MODEL
• Shlikhta Architecture
• Layered Architecture
• Hexagonal Architecture
• CQRS
• Transaction Script
• Active Record
• Domain Model
• Event Sourced Domain Model
Slide 41
Slide 41 text
TESTING
STRATEGIES
Slide 42
Slide 42 text
TESTS PYRAMID
UI
/
End to End
Service / API
layer tests
Unit Tests
Slide 43
Slide 43 text
TESTS PYRAMID
UI
/
End to End
Service / API
layer tests
Unit Tests
Slide 44
Slide 44 text
TESTS PYRAMID
UI
/
End to End
Service / API
layer tests
Unit Tests
Slide 45
Slide 45 text
TESTS PYRAMID
UI
/
End to End
Service / API
layer tests
Unit Tests
Slide 46
Slide 46 text
TESTING STRATEGIES
• End to end tests
• API layer tests
• Unit tests
• Unit tests
• Transaction Script
• Active Record
• Domain Model
• Event Sourced Domain Model
Slide 47
Slide 47 text
LANGUAGE AND
TECHNOLOGY
Slide 48
Slide 48 text
PROGRAMMING STYLE
• Procedural
• Procedural / OOP
• OOP
• Functional
• Transaction Script
• Active Record
• Domain Model
• Event Sourced Domain Model
Slide 49
Slide 49 text
DYNAMIC / STATIC TYPING
• Dynamic
• Dynamic
• Static
• Static
• Transaction Script
• Active Record
• Domain Model
• Event Sourced Domain Model
Slide 50
Slide 50 text
RAMIFICATIONS
▸ Architectural style / pattern
▸ Testing strategy
▸ Language and technology
▸ Programming style
▸ Language type
Slide 51
Slide 51 text
DECISION HEURISTIC
▸ Is the business logic mostly CRUD / ETL? Yes
▸ Are the data structures simple? yes - Transaction Script
▸ Are the data structures simple? No -Active Record
▸ Is the business logic mostly CRUD / ETL? No
▸ Is advanced analysis required, or dealing w/ money? No
Domain Model
▸ Is advanced analysis required, or dealing w/ money? Yes
Event Sourced Domain Model
Slide 52
Slide 52 text
TRANSACTION SCRIPT
ACTIVE RECORD
DOMAIN MODEL
EVENT SOURCED DOMAIN MODEL
Slide 53
Slide 53 text
AGILE ARCHITECTURE
Slide 54
Slide 54 text
TRANSACTION SCRIPT / SHLIKHTA
ACTIVE RECORD / LAYERS
DOMAIN MODEL / HEXAGONAL
EVENT SOURCED DOMAIN MODEL / CQRS
Slide 55
Slide 55 text
DECISION SCOPE
Slide 56
Slide 56 text
CAMPAIGN MANAGEMENT LEAD MANAGEMENT
Slide 57
Slide 57 text
CAMPAIGN MANAGEMENT
LEAD MANAGEMENT
CREATIVE CATALOG
CAMPAIGN PUBLISHING
BILLING
USERS MANAGEMENT
SALES
COMMISSIONS CALCULATION
DESK MANAGEMENT
VOIP MANAGEMENT
Slide 58
Slide 58 text
SUMMARY
Slide 59
Slide 59 text
Business Driven Architecture
Slide 60
Slide 60 text
No content
Slide 61
Slide 61 text
QUESTIONS?
Slide 62
Slide 62 text
THANK YOU
Vladik Khononov
Chief Architect @ Internovus
@vladikk
http://vladikk.com