SlideShare a Scribd company logo
Implementing
Domain Driven Design (DDD)
a practical guide
https://github.com/hikalkan/presentations
ABOUT ME
Halil İbrahim Kalkan
Web: halilibrahimkalkan.com
Github: @hikalkan
Twitter: @hibrahimkalkan
Co-Founder of
ASP.NET BOILERPLATE
6+ years continuous development
7.000+ stars on GitHub
1.500.000+ downloads on NuGet
https://aspnetboilerplate.com
Agenda
• Part-I: What is DDD?
• Architecture & layers
• Execution flow
• Building blocks
• Common principles
• Part-II: Implementing DDD
• Layering a Visual Studio solution
• Rules & Best Practices
• Examples
Part-I: What is DDD?
What is DDD?
• Domain-driven design (DDD) is an approach to
software development for complex needs by
connecting the implementation to an evolving model
• Focuses on the core domain logic rather than the
infrastructure.
• Suitable for complex domains and large-scale
applications.
• Helps to build a flexible, modular and maintainable
code base, based on the Object Oriented
Programming principles.
Domain Driven Design
Layers & Clean Architecture
Infrastructure
Layer
Presentation Layer
Application Layer
Domain Layer
Domain Driven Design
Core Building Blocks
Domain Layer
• Entity
• Value Object
• Aggregate & Aggregate Root
• Repository
• Domain Service
• Specification
• …
Application Layer
• Application Service
• Data Transfer Object (DTO)
• Unit of Work
• …
Domain Driven Design
Layering in Visual Studio
Application Layer
Domain Layer
Infrastructure Layer
Presentation Layer
Test Projects
• Domain.Shared
• IssueConsts
• IssueType (enum)
• Domain
• Issue
• IssueManager
• IIssueRepository
• Application.Contracts
• IIssueAppService
• IssueDto, IssueCreationDto
• Application
• IssueAppService (implementation)
• Infrastructure / EntityFrameworkCore
• EfCoreIssueRepository
• MyDbContext
• Web
• IssueController
• IssueViewModel
• Issues.cshtml
• Issues.js
Domain Driven Design
Layering in Visual Studio
Domain.SharedDomain
App.ContractsApplication
Web
Infrastructure / EntityFrameworkCore
Domain Driven Design
Execution Flow
Application
Services
Domain Services
Entities
Repositories
(interface)
HTTP API
MVC UIBrowsers
Remote clients DTO
DTO
HTTP request
HTTP request
HTML/JSON/js/css
JSON
DOMAIN layerAPPLICATION layerPRESENTATION layer
Distributed Services
Layer
Authorization
Validation
Exception Handling
Audit Logging
Caching
Authorization
Validation
Audit Logging
Unit of Work / DB Transaction
C R O S S C U T T I N G C O N C E R N S
Domain Driven Design
Common Principles
• Database / ORM independence
• Presentation technology agnostic
• Doesn’t care about reporting / mass querying
• Focuses on state changes of domain objects
Part-II: Implementation
Implementing Domain Driven Design (DDD)
Aggregates
Example
Guid Id
--------------------------------------
string Text
bool IsClosed
Enum CloseReason
--------------------------------------
Guid RepositoryId
Guid AssignedUserId
--------------------------------------
ICollection<Comment>
ICollection<IssueLabel>
Issue (aggregate root)
Guid IssueId
Guid LabelId
IssueLabel (value obj)
Guid Id
--------------------------------------
string Text
DateTime CreationTime
--------------------------------------
Guid IssueId
Guid UserId
Comment (entity)
Guid Id
--------------------------------------
string Name
…
…
Repository (agg. root)
Guid Id
--------------------------------------
string UserName
string Password
…
User (agg. root)
Guid Id
--------------------------------------
string Name
string Color
…
Label (agg. root)
Guid Id
--------------------------------------
…
…
Other (entity)
Issue Aggregate
Repository
Aggregate
User Aggregate
Label Aggregate
Aggregate Roots
Principles
• Saved & retrieved as a single unit
(with all sub-collections & all
properties)
• Should maintain self integrity &
validity by implementing domain
rules & constraints
• Responsible to manage sub
entities/objects
• An aggregate is generally
considered as a transaction
boundary.
• Should be serializable (already
required for NoSQL databases)
Aggregate Roots
Rule: Reference Other Aggregates only by Id
• Don’t define collections to other
aggregates!
• Don’t define navigation property to other
aggregates!
• Reference to other aggregate roots by Id.
Aggregate Roots
Tip: Keep it small
Considerations;
• Objects used together
• Query Performance
• Data Integrity & Validity
Aggregate Roots / Entities
Primary Keys
Aggregate Root
Define a single Primary Key (Id)
Entity
Can define a composite Primary Key
Suggestion: Prefer GUID as the PK
Aggregate Roots & Entities
Constructor
• Force to create a VALID entity
• Get minimum required arguments
• Check validity of inputs
• Initialize sub collections
• Create a private default constructor for
ORMs & deserialization
• Tip: Get id as an argument, don’t use
Guid.NewGuid() inside the constructor
• Use a service to create GUIDs
Aggregate Roots & Entities
Property Accessors & Methods
• Maintain object validity
• Use private setters when needed
• Change properties via methods
Aggregate Roots & Entities
Business Logic & Exceptions
• Implement Business Rules
• Define and throw specialized
exceptions
Aggregate Roots & Entities
Business Logic Requires External Services
• How to implement when you need external services?
• Business Rule: Can not assign more than 3 issues to a user!
Aggregate Roots & Entities
Business Logic Requires External Services
• How to implement when you need external services?
• Business Rule: Can not assign more than 3 issues to a user!
ALTERNATIVE..?
Create a Domain Service!
Repositories
Principles
• A repository is a collection-like interface to interact with the database
to read and write entities
• Define interface in the domain layer, implement in the infrastructure
• Do not include domain logic
• Repository interface should be database / ORM independent
• Create repositories for aggregate roots, not entities
Repositories
Do not Include Domain Logic
What is an In-Active issue?
Repositories
Do not Include Domain Logic
• Implicit definition of a
domain rule!
• How to re-use this
expression?
Repositories
Do not Include Domain Logic
• Implicit definition of a
domain rule!
• How to re-use this
expression?
• Copy/paste?
• Solution: The Specification
Pattern!
Specifications
Specification Interface
• A specification is a named, reusable & combinable class to filter
objects.
Specifications
Specification Interface
• A specification is a named, reusable & combinable class to filter
objects.
Specifications
Base Specification Class
Specifications
Define a Specification
Specifications
Use the Specification
Specifications
Use the Specification
Specifications
Combining Specifications
Specifications
Combining Specifications
Domain Services
Principles
• Implements domain logic that;
• Depends on services and repositories
• Needs to work with multiple entities / entity types
• Works with domain objects, not DTOs
Domain Services
Example
Business Rule: Can not assign more than 3 issues to a user
Domain Services
Example
Application Services
Principles
• Implement use cases of the application (application logic)
• Do not implement core domain logic
• Get & return Data Transfer Objects, not entities
• Use domain services, entities, repositories and other domain objects
inside
Application Services
Example • Inject domain services & repositories
• Get DTO as argument
• Get aggregate roots from repositories
• Use domain service to perform the
domain logic
• Always update the entity explicitly
(don’t assume the change tracking)
Application Services
Common DTO Principles Best Practices
• Should be serializable
• Should have a parameterless constructor
• Should not contain any business logic
• Never inherit from entities! Never reference to entities!
Application Services
Input DTO Best Practices
• Define only the properties needed for the use case
• Do not reuse same input DTO for multiple use
cases (service methods)
• Id is not used in create! Do not share
same DTO for create & update!
• Password is not used in Update and
ChangeUserName!
• CreationTime should not be sent by
the client!
Application Services
Input DTO Best Practices
• Define only the properties needed for the use case
• Do not reuse same input DTO for multiple use
cases (service methods)
Application Services
Input DTO Best Practices
• Implement only the formal validation (can use data annotation attributes)
• Don’t include domain validation logic (ex: unique user name constraint)
Application Services
Output DTO suggestions
• Keep output DTO count minimum. Reuse where possible (except input DTOs as output DTO).
• Can contain more properties than client needs
• Return the entity DTO from Create & update methods.
• Exception: Where performance is critical, especially for large result sets.
Application Services
Output DTO suggestions
Application Services
Object to Object Mapping
• Use auto object mapping libraries (but, carefully – enable configuration
validation)
• Do not map input DTOs to entities.
• Map entities to output DTOs
Application Services
Example: Entity Creation & DTO Mapping
• Don’t use DTO to entity auto-
mapping, use entity constructor.
• Perform additional domain actions.
• Use repository to insert the entity.
• Return DTO using auto-mapping.
Multiple Application Layers
Domain Layer
Back Office Application
Layer
Public Web Application
Layer
Mobile Application
Layer
Mobile APIMVC UIREST API
SPA Browser Mobile App
• Create separate application layers
for each application type.
• Use a single domain layer to share
the core domain logic.
Application Logic & Domain Logic
Examples..?
Business Logic
Application Logic
(Use Cases)
Domain Logic
Application Logic & Domain Logic
• Don’t create domain services to perform
simple CRUD operations!
• Use Repositories in the application services.
• Never pass DTOs to or return DTOs from
domain services!
• DTOs should be in the application layer.
Application Logic & Domain Logic
• Domain service should check
duplicate organization name.
• Domain service doesn’t perform
authorization!
• Do in the application layer!
• Domain service must not depend on
the current user!
• Do in the application/UI/API layer!
• Domain service must not send email
that is not related to the actual
business!
• Do in the application layer or implement
via domain events.
Application Logic & Domain Logic
• Application service methods should be a unit of
work (transactional) if contains more than one
database operations.
• Authorization is done in the application layer.
• Payment (infrastructure service) and Organization
creation should not be combined in the domain
layer. Should be orchestrated by the application
layer.
• Email sending can be done in the application service.
• Do not return entities from application services!
• Why not moving payment logic inside the domain
service?
Reference Books
Domain Driven Design
Eric Evans
Implementing
Domain Driven Design
Vaughn Vernon
Clean Architecture
Robert C. Martin
Thanks..! Questions..?
Halil İbrahim Kalkan
• http://halilibrahimkalkan.com
• GitHub @hikalkan
• Twitter @hibrahimkalkan
Presentation:
https://github.com/hikalkan/presentations

More Related Content

What's hot

Implementing DDD with C#
Implementing DDD with C#Implementing DDD with C#
Implementing DDD with C#
Pascal Laurin
 
Applying Systems Thinking to Software Architecture
Applying Systems Thinking to Software ArchitectureApplying Systems Thinking to Software Architecture
Applying Systems Thinking to Software Architecture
Matt McLarty
 
Microservices Architecture - Cloud Native Apps
Microservices Architecture - Cloud Native AppsMicroservices Architecture - Cloud Native Apps
Microservices Architecture - Cloud Native Apps
Araf Karsh Hamid
 
Automation of Release and Deployment Management - Maveric
Automation of Release and Deployment Management - MavericAutomation of Release and Deployment Management - Maveric
Automation of Release and Deployment Management - Maveric
Maveric Systems
 
Event storming recipes
Event storming recipesEvent storming recipes
Event storming recipes
Alberto Brandolini
 
Sample project requirements_checklist
Sample project requirements_checklistSample project requirements_checklist
Sample project requirements_checklist
srinivastadela
 
TOGAF Classroom Series - M1 intro-ea-togaf
TOGAF Classroom Series - M1 intro-ea-togafTOGAF Classroom Series - M1 intro-ea-togaf
TOGAF Classroom Series - M1 intro-ea-togaf
Cuneyt Kaya
 
Implementing Domain-Driven Design study group - ch. 5 entities
Implementing Domain-Driven Design study group - ch. 5 entitiesImplementing Domain-Driven Design study group - ch. 5 entities
Implementing Domain-Driven Design study group - ch. 5 entities
Henry Tong
 
Product Lifecycle in JIRA
Product Lifecycle in JIRAProduct Lifecycle in JIRA
Product Lifecycle in JIRA
Sangeetha Jithendran
 
Scrum + bdd + ddd
Scrum + bdd + dddScrum + bdd + ddd
Scrum + bdd + ddd
Helder De Oliveira
 
Agile Story Writing
Agile Story WritingAgile Story Writing
Agile Story Writing
Intelliware Development Inc.
 
CQRS recipes or how to cook your architecture
CQRS recipes or how to cook your architectureCQRS recipes or how to cook your architecture
CQRS recipes or how to cook your architecture
Thomas Jaskula
 
Clean Architecture Essentials - Stockholm Software Craftsmanship
Clean Architecture Essentials - Stockholm Software CraftsmanshipClean Architecture Essentials - Stockholm Software Craftsmanship
Clean Architecture Essentials - Stockholm Software Craftsmanship
Ivan Paulovich
 
Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Domain Driven Design Demonstrated
Domain Driven Design Demonstrated
Alan Christensen
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
Araf Karsh Hamid
 
Patterns for distributed systems
Patterns for distributed systemsPatterns for distributed systems
Patterns for distributed systems
Paulo Gandra de Sousa
 
DevDay2017 ESGI Essential DDD
DevDay2017 ESGI Essential DDDDevDay2017 ESGI Essential DDD
DevDay2017 ESGI Essential DDD
Gregory Boissinot
 
What is Enterprise Architecture?
What is Enterprise Architecture?What is Enterprise Architecture?
What is Enterprise Architecture?
Brett Colbert
 
CQRS in 4 steps
CQRS in 4 stepsCQRS in 4 steps
CQRS in 4 steps
Radosław Maziarka
 
Event-Driven Architecture (EDA)
Event-Driven Architecture (EDA)Event-Driven Architecture (EDA)
Event-Driven Architecture (EDA)
WSO2
 

What's hot (20)

Implementing DDD with C#
Implementing DDD with C#Implementing DDD with C#
Implementing DDD with C#
 
Applying Systems Thinking to Software Architecture
Applying Systems Thinking to Software ArchitectureApplying Systems Thinking to Software Architecture
Applying Systems Thinking to Software Architecture
 
Microservices Architecture - Cloud Native Apps
Microservices Architecture - Cloud Native AppsMicroservices Architecture - Cloud Native Apps
Microservices Architecture - Cloud Native Apps
 
Automation of Release and Deployment Management - Maveric
Automation of Release and Deployment Management - MavericAutomation of Release and Deployment Management - Maveric
Automation of Release and Deployment Management - Maveric
 
Event storming recipes
Event storming recipesEvent storming recipes
Event storming recipes
 
Sample project requirements_checklist
Sample project requirements_checklistSample project requirements_checklist
Sample project requirements_checklist
 
TOGAF Classroom Series - M1 intro-ea-togaf
TOGAF Classroom Series - M1 intro-ea-togafTOGAF Classroom Series - M1 intro-ea-togaf
TOGAF Classroom Series - M1 intro-ea-togaf
 
Implementing Domain-Driven Design study group - ch. 5 entities
Implementing Domain-Driven Design study group - ch. 5 entitiesImplementing Domain-Driven Design study group - ch. 5 entities
Implementing Domain-Driven Design study group - ch. 5 entities
 
Product Lifecycle in JIRA
Product Lifecycle in JIRAProduct Lifecycle in JIRA
Product Lifecycle in JIRA
 
Scrum + bdd + ddd
Scrum + bdd + dddScrum + bdd + ddd
Scrum + bdd + ddd
 
Agile Story Writing
Agile Story WritingAgile Story Writing
Agile Story Writing
 
CQRS recipes or how to cook your architecture
CQRS recipes or how to cook your architectureCQRS recipes or how to cook your architecture
CQRS recipes or how to cook your architecture
 
Clean Architecture Essentials - Stockholm Software Craftsmanship
Clean Architecture Essentials - Stockholm Software CraftsmanshipClean Architecture Essentials - Stockholm Software Craftsmanship
Clean Architecture Essentials - Stockholm Software Craftsmanship
 
Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Domain Driven Design Demonstrated
Domain Driven Design Demonstrated
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Patterns for distributed systems
Patterns for distributed systemsPatterns for distributed systems
Patterns for distributed systems
 
DevDay2017 ESGI Essential DDD
DevDay2017 ESGI Essential DDDDevDay2017 ESGI Essential DDD
DevDay2017 ESGI Essential DDD
 
What is Enterprise Architecture?
What is Enterprise Architecture?What is Enterprise Architecture?
What is Enterprise Architecture?
 
CQRS in 4 steps
CQRS in 4 stepsCQRS in 4 steps
CQRS in 4 steps
 
Event-Driven Architecture (EDA)
Event-Driven Architecture (EDA)Event-Driven Architecture (EDA)
Event-Driven Architecture (EDA)
 

Similar to .NET Fest 2019. Halil Ibrahim Kalkan. Implementing Domain Driven Design

Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
Up2 Technology
 
Software design with Domain-driven design
Software design with Domain-driven design Software design with Domain-driven design
Software design with Domain-driven design
Allan Mangune
 
Decision CAMP 2014 - Erik Marutian - Using rules-based gui framework to power...
Decision CAMP 2014 - Erik Marutian - Using rules-based gui framework to power...Decision CAMP 2014 - Erik Marutian - Using rules-based gui framework to power...
Decision CAMP 2014 - Erik Marutian - Using rules-based gui framework to power...
Decision CAMP
 
An Introduction to Domain Driven Design in PHP
An Introduction to Domain Driven Design in PHPAn Introduction to Domain Driven Design in PHP
An Introduction to Domain Driven Design in PHP
Chris Renner
 
2019-Nov: Domain Driven Design (DDD) and when not to use it
2019-Nov: Domain Driven Design (DDD) and when not to use it2019-Nov: Domain Driven Design (DDD) and when not to use it
2019-Nov: Domain Driven Design (DDD) and when not to use it
Mark Windholtz
 
Soa 1 7.ppsx
Soa 1 7.ppsxSoa 1 7.ppsx
Soa 1 7.ppsx
ssuser3a47cb
 
Application Architecture
Application ArchitectureApplication Architecture
Application Architecture
Lars-Erik Kindblad
 
Dojo Grids in XPages
Dojo Grids in XPagesDojo Grids in XPages
Dojo Grids in XPages
Teamstudio
 
Sitecore development approach evolution – destination helix
Sitecore development approach evolution – destination helixSitecore development approach evolution – destination helix
Sitecore development approach evolution – destination helix
Peter Nazarov
 
Diksha sda presentation
Diksha sda presentationDiksha sda presentation
Diksha sda presentation
dikshagupta111
 
ow.ppt
ow.pptow.ppt
ow.ppt
ssuser96a63c
 
ow.ppt
ow.pptow.ppt
Ow
OwOw
Introduction to DDD
Introduction to DDDIntroduction to DDD
Introduction to DDD
Eduards Sizovs
 
Azure Digital Twins 2.0
Azure Digital Twins 2.0Azure Digital Twins 2.0
Azure Digital Twins 2.0
Marco Parenzan
 
Improving The Quality of Existing Software
Improving The Quality of Existing SoftwareImproving The Quality of Existing Software
Improving The Quality of Existing Software
Steven Smith
 
Improving the Quality of Existing Software
Improving the Quality of Existing SoftwareImproving the Quality of Existing Software
Improving the Quality of Existing Software
Steven Smith
 
From ddd to DDD : My journey from data-driven development to Domain-Driven De...
From ddd to DDD : My journey from data-driven development to Domain-Driven De...From ddd to DDD : My journey from data-driven development to Domain-Driven De...
From ddd to DDD : My journey from data-driven development to Domain-Driven De...
Thibaud Desodt
 
SDWest2005Goetsch
SDWest2005GoetschSDWest2005Goetsch
SDWest2005Goetsch
Mark Goetsch
 
Code for Startup MVP (Ruby on Rails) Session 1
Code for Startup MVP (Ruby on Rails) Session 1Code for Startup MVP (Ruby on Rails) Session 1
Code for Startup MVP (Ruby on Rails) Session 1
Henry S
 

Similar to .NET Fest 2019. Halil Ibrahim Kalkan. Implementing Domain Driven Design (20)

Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
Software design with Domain-driven design
Software design with Domain-driven design Software design with Domain-driven design
Software design with Domain-driven design
 
Decision CAMP 2014 - Erik Marutian - Using rules-based gui framework to power...
Decision CAMP 2014 - Erik Marutian - Using rules-based gui framework to power...Decision CAMP 2014 - Erik Marutian - Using rules-based gui framework to power...
Decision CAMP 2014 - Erik Marutian - Using rules-based gui framework to power...
 
An Introduction to Domain Driven Design in PHP
An Introduction to Domain Driven Design in PHPAn Introduction to Domain Driven Design in PHP
An Introduction to Domain Driven Design in PHP
 
2019-Nov: Domain Driven Design (DDD) and when not to use it
2019-Nov: Domain Driven Design (DDD) and when not to use it2019-Nov: Domain Driven Design (DDD) and when not to use it
2019-Nov: Domain Driven Design (DDD) and when not to use it
 
Soa 1 7.ppsx
Soa 1 7.ppsxSoa 1 7.ppsx
Soa 1 7.ppsx
 
Application Architecture
Application ArchitectureApplication Architecture
Application Architecture
 
Dojo Grids in XPages
Dojo Grids in XPagesDojo Grids in XPages
Dojo Grids in XPages
 
Sitecore development approach evolution – destination helix
Sitecore development approach evolution – destination helixSitecore development approach evolution – destination helix
Sitecore development approach evolution – destination helix
 
Diksha sda presentation
Diksha sda presentationDiksha sda presentation
Diksha sda presentation
 
ow.ppt
ow.pptow.ppt
ow.ppt
 
ow.ppt
ow.pptow.ppt
ow.ppt
 
Ow
OwOw
Ow
 
Introduction to DDD
Introduction to DDDIntroduction to DDD
Introduction to DDD
 
Azure Digital Twins 2.0
Azure Digital Twins 2.0Azure Digital Twins 2.0
Azure Digital Twins 2.0
 
Improving The Quality of Existing Software
Improving The Quality of Existing SoftwareImproving The Quality of Existing Software
Improving The Quality of Existing Software
 
Improving the Quality of Existing Software
Improving the Quality of Existing SoftwareImproving the Quality of Existing Software
Improving the Quality of Existing Software
 
From ddd to DDD : My journey from data-driven development to Domain-Driven De...
From ddd to DDD : My journey from data-driven development to Domain-Driven De...From ddd to DDD : My journey from data-driven development to Domain-Driven De...
From ddd to DDD : My journey from data-driven development to Domain-Driven De...
 
SDWest2005Goetsch
SDWest2005GoetschSDWest2005Goetsch
SDWest2005Goetsch
 
Code for Startup MVP (Ruby on Rails) Session 1
Code for Startup MVP (Ruby on Rails) Session 1Code for Startup MVP (Ruby on Rails) Session 1
Code for Startup MVP (Ruby on Rails) Session 1
 

More from NETFest

.NET Fest 2019. Николай Балакин. Микрооптимизации в мире .NET
.NET Fest 2019. Николай Балакин. Микрооптимизации в мире .NET.NET Fest 2019. Николай Балакин. Микрооптимизации в мире .NET
.NET Fest 2019. Николай Балакин. Микрооптимизации в мире .NET
NETFest
 
.NET Fest 2019. Сергей Калинец. Efficient Microservice Communication with .NE...
.NET Fest 2019. Сергей Калинец. Efficient Microservice Communication with .NE....NET Fest 2019. Сергей Калинец. Efficient Microservice Communication with .NE...
.NET Fest 2019. Сергей Калинец. Efficient Microservice Communication with .NE...
NETFest
 
.NET Fest 2019. Оля Гавриш. .NET Core 3.0 и будущее .NET
.NET Fest 2019. Оля Гавриш. .NET Core 3.0 и будущее .NET.NET Fest 2019. Оля Гавриш. .NET Core 3.0 и будущее .NET
.NET Fest 2019. Оля Гавриш. .NET Core 3.0 и будущее .NET
NETFest
 
.NET Fest 2019. Оля Гавриш. Машинное обучение для .NET программистов
.NET Fest 2019. Оля Гавриш. Машинное обучение для .NET программистов.NET Fest 2019. Оля Гавриш. Машинное обучение для .NET программистов
.NET Fest 2019. Оля Гавриш. Машинное обучение для .NET программистов
NETFest
 
.NET Fest 2019. Roberto Freato. Provisioning Azure PaaS fluently with Managem...
.NET Fest 2019. Roberto Freato. Provisioning Azure PaaS fluently with Managem....NET Fest 2019. Roberto Freato. Provisioning Azure PaaS fluently with Managem...
.NET Fest 2019. Roberto Freato. Provisioning Azure PaaS fluently with Managem...
NETFest
 
.NET Fest 2019. Сергій Бута. Feature Toggles: Dynamic Configuration at Wirex
.NET Fest 2019. Сергій Бута. Feature Toggles: Dynamic Configuration at Wirex.NET Fest 2019. Сергій Бута. Feature Toggles: Dynamic Configuration at Wirex
.NET Fest 2019. Сергій Бута. Feature Toggles: Dynamic Configuration at Wirex
NETFest
 
.NET Fest 2019. Michael Staib. Hot Chocolate: GraphQL Schema Stitching with A...
.NET Fest 2019. Michael Staib. Hot Chocolate: GraphQL Schema Stitching with A....NET Fest 2019. Michael Staib. Hot Chocolate: GraphQL Schema Stitching with A...
.NET Fest 2019. Michael Staib. Hot Chocolate: GraphQL Schema Stitching with A...
NETFest
 
.NET Fest 2019. Андрей Литвинов. Async lifetime tests with xUnit and AutoFixture
.NET Fest 2019. Андрей Литвинов. Async lifetime tests with xUnit and AutoFixture.NET Fest 2019. Андрей Литвинов. Async lifetime tests with xUnit and AutoFixture
.NET Fest 2019. Андрей Литвинов. Async lifetime tests with xUnit and AutoFixture
NETFest
 
.NET Fest 2019. Анатолий Колесник. Love, Death & F# Tests
.NET Fest 2019. Анатолий Колесник. Love, Death & F# Tests.NET Fest 2019. Анатолий Колесник. Love, Death & F# Tests
.NET Fest 2019. Анатолий Колесник. Love, Death & F# Tests
NETFest
 
.NET Fest 2019. Алексей Голуб. Монадные парсер-комбинаторы в C# (простой спос...
.NET Fest 2019. Алексей Голуб. Монадные парсер-комбинаторы в C# (простой спос....NET Fest 2019. Алексей Голуб. Монадные парсер-комбинаторы в C# (простой спос...
.NET Fest 2019. Алексей Голуб. Монадные парсер-комбинаторы в C# (простой спос...
NETFest
 
.NET Fest 2019. Roberto Freato. Azure App Service deep dive
.NET Fest 2019. Roberto Freato. Azure App Service deep dive.NET Fest 2019. Roberto Freato. Azure App Service deep dive
.NET Fest 2019. Roberto Freato. Azure App Service deep dive
NETFest
 
.NET Fest 2019. Леонид Молотиевский. DotNet Core in production
.NET Fest 2019. Леонид Молотиевский. DotNet Core in production.NET Fest 2019. Леонид Молотиевский. DotNet Core in production
.NET Fest 2019. Леонид Молотиевский. DotNet Core in production
NETFest
 
.NET Fest 2019. Александр Демчук. How to measure relationships within the Com...
.NET Fest 2019. Александр Демчук. How to measure relationships within the Com....NET Fest 2019. Александр Демчук. How to measure relationships within the Com...
.NET Fest 2019. Александр Демчук. How to measure relationships within the Com...
NETFest
 
.NET Fest 2019. Anna Melashkina та Philipp Bauknecht. Dragons in a Mixed Real...
.NET Fest 2019. Anna Melashkina та Philipp Bauknecht. Dragons in a Mixed Real....NET Fest 2019. Anna Melashkina та Philipp Bauknecht. Dragons in a Mixed Real...
.NET Fest 2019. Anna Melashkina та Philipp Bauknecht. Dragons in a Mixed Real...
NETFest
 
.NET Fest 2019. Alex Thissen. Architecting .NET solutions in a Docker ecosystem
.NET Fest 2019. Alex Thissen. Architecting .NET solutions in a Docker ecosystem.NET Fest 2019. Alex Thissen. Architecting .NET solutions in a Docker ecosystem
.NET Fest 2019. Alex Thissen. Architecting .NET solutions in a Docker ecosystem
NETFest
 
.NET Fest 2019. Stas Lebedenko. Practical serverless use cases in Azure with ...
.NET Fest 2019. Stas Lebedenko. Practical serverless use cases in Azure with ....NET Fest 2019. Stas Lebedenko. Practical serverless use cases in Azure with ...
.NET Fest 2019. Stas Lebedenko. Practical serverless use cases in Azure with ...
NETFest
 
.NET Fest 2019. Сергей Медведев. How serverless makes Integration TDD a reali...
.NET Fest 2019. Сергей Медведев. How serverless makes Integration TDD a reali....NET Fest 2019. Сергей Медведев. How serverless makes Integration TDD a reali...
.NET Fest 2019. Сергей Медведев. How serverless makes Integration TDD a reali...
NETFest
 
.NET Fest 2019. Сергей Корж. Natural Language Processing in .NET
.NET Fest 2019. Сергей Корж. Natural Language Processing in .NET.NET Fest 2019. Сергей Корж. Natural Language Processing in .NET
.NET Fest 2019. Сергей Корж. Natural Language Processing in .NET
NETFest
 
.NET Fest 2019. Eran Stiller. Create Your Own Serverless PKI with .NET & Azur...
.NET Fest 2019. Eran Stiller. Create Your Own Serverless PKI with .NET & Azur....NET Fest 2019. Eran Stiller. Create Your Own Serverless PKI with .NET & Azur...
.NET Fest 2019. Eran Stiller. Create Your Own Serverless PKI with .NET & Azur...
NETFest
 
.NET Fest 2019. Eran Stiller. 6 Lessons I Learned on My Journey from Monolith...
.NET Fest 2019. Eran Stiller. 6 Lessons I Learned on My Journey from Monolith....NET Fest 2019. Eran Stiller. 6 Lessons I Learned on My Journey from Monolith...
.NET Fest 2019. Eran Stiller. 6 Lessons I Learned on My Journey from Monolith...
NETFest
 

More from NETFest (20)

.NET Fest 2019. Николай Балакин. Микрооптимизации в мире .NET
.NET Fest 2019. Николай Балакин. Микрооптимизации в мире .NET.NET Fest 2019. Николай Балакин. Микрооптимизации в мире .NET
.NET Fest 2019. Николай Балакин. Микрооптимизации в мире .NET
 
.NET Fest 2019. Сергей Калинец. Efficient Microservice Communication with .NE...
.NET Fest 2019. Сергей Калинец. Efficient Microservice Communication with .NE....NET Fest 2019. Сергей Калинец. Efficient Microservice Communication with .NE...
.NET Fest 2019. Сергей Калинец. Efficient Microservice Communication with .NE...
 
.NET Fest 2019. Оля Гавриш. .NET Core 3.0 и будущее .NET
.NET Fest 2019. Оля Гавриш. .NET Core 3.0 и будущее .NET.NET Fest 2019. Оля Гавриш. .NET Core 3.0 и будущее .NET
.NET Fest 2019. Оля Гавриш. .NET Core 3.0 и будущее .NET
 
.NET Fest 2019. Оля Гавриш. Машинное обучение для .NET программистов
.NET Fest 2019. Оля Гавриш. Машинное обучение для .NET программистов.NET Fest 2019. Оля Гавриш. Машинное обучение для .NET программистов
.NET Fest 2019. Оля Гавриш. Машинное обучение для .NET программистов
 
.NET Fest 2019. Roberto Freato. Provisioning Azure PaaS fluently with Managem...
.NET Fest 2019. Roberto Freato. Provisioning Azure PaaS fluently with Managem....NET Fest 2019. Roberto Freato. Provisioning Azure PaaS fluently with Managem...
.NET Fest 2019. Roberto Freato. Provisioning Azure PaaS fluently with Managem...
 
.NET Fest 2019. Сергій Бута. Feature Toggles: Dynamic Configuration at Wirex
.NET Fest 2019. Сергій Бута. Feature Toggles: Dynamic Configuration at Wirex.NET Fest 2019. Сергій Бута. Feature Toggles: Dynamic Configuration at Wirex
.NET Fest 2019. Сергій Бута. Feature Toggles: Dynamic Configuration at Wirex
 
.NET Fest 2019. Michael Staib. Hot Chocolate: GraphQL Schema Stitching with A...
.NET Fest 2019. Michael Staib. Hot Chocolate: GraphQL Schema Stitching with A....NET Fest 2019. Michael Staib. Hot Chocolate: GraphQL Schema Stitching with A...
.NET Fest 2019. Michael Staib. Hot Chocolate: GraphQL Schema Stitching with A...
 
.NET Fest 2019. Андрей Литвинов. Async lifetime tests with xUnit and AutoFixture
.NET Fest 2019. Андрей Литвинов. Async lifetime tests with xUnit and AutoFixture.NET Fest 2019. Андрей Литвинов. Async lifetime tests with xUnit and AutoFixture
.NET Fest 2019. Андрей Литвинов. Async lifetime tests with xUnit and AutoFixture
 
.NET Fest 2019. Анатолий Колесник. Love, Death & F# Tests
.NET Fest 2019. Анатолий Колесник. Love, Death & F# Tests.NET Fest 2019. Анатолий Колесник. Love, Death & F# Tests
.NET Fest 2019. Анатолий Колесник. Love, Death & F# Tests
 
.NET Fest 2019. Алексей Голуб. Монадные парсер-комбинаторы в C# (простой спос...
.NET Fest 2019. Алексей Голуб. Монадные парсер-комбинаторы в C# (простой спос....NET Fest 2019. Алексей Голуб. Монадные парсер-комбинаторы в C# (простой спос...
.NET Fest 2019. Алексей Голуб. Монадные парсер-комбинаторы в C# (простой спос...
 
.NET Fest 2019. Roberto Freato. Azure App Service deep dive
.NET Fest 2019. Roberto Freato. Azure App Service deep dive.NET Fest 2019. Roberto Freato. Azure App Service deep dive
.NET Fest 2019. Roberto Freato. Azure App Service deep dive
 
.NET Fest 2019. Леонид Молотиевский. DotNet Core in production
.NET Fest 2019. Леонид Молотиевский. DotNet Core in production.NET Fest 2019. Леонид Молотиевский. DotNet Core in production
.NET Fest 2019. Леонид Молотиевский. DotNet Core in production
 
.NET Fest 2019. Александр Демчук. How to measure relationships within the Com...
.NET Fest 2019. Александр Демчук. How to measure relationships within the Com....NET Fest 2019. Александр Демчук. How to measure relationships within the Com...
.NET Fest 2019. Александр Демчук. How to measure relationships within the Com...
 
.NET Fest 2019. Anna Melashkina та Philipp Bauknecht. Dragons in a Mixed Real...
.NET Fest 2019. Anna Melashkina та Philipp Bauknecht. Dragons in a Mixed Real....NET Fest 2019. Anna Melashkina та Philipp Bauknecht. Dragons in a Mixed Real...
.NET Fest 2019. Anna Melashkina та Philipp Bauknecht. Dragons in a Mixed Real...
 
.NET Fest 2019. Alex Thissen. Architecting .NET solutions in a Docker ecosystem
.NET Fest 2019. Alex Thissen. Architecting .NET solutions in a Docker ecosystem.NET Fest 2019. Alex Thissen. Architecting .NET solutions in a Docker ecosystem
.NET Fest 2019. Alex Thissen. Architecting .NET solutions in a Docker ecosystem
 
.NET Fest 2019. Stas Lebedenko. Practical serverless use cases in Azure with ...
.NET Fest 2019. Stas Lebedenko. Practical serverless use cases in Azure with ....NET Fest 2019. Stas Lebedenko. Practical serverless use cases in Azure with ...
.NET Fest 2019. Stas Lebedenko. Practical serverless use cases in Azure with ...
 
.NET Fest 2019. Сергей Медведев. How serverless makes Integration TDD a reali...
.NET Fest 2019. Сергей Медведев. How serverless makes Integration TDD a reali....NET Fest 2019. Сергей Медведев. How serverless makes Integration TDD a reali...
.NET Fest 2019. Сергей Медведев. How serverless makes Integration TDD a reali...
 
.NET Fest 2019. Сергей Корж. Natural Language Processing in .NET
.NET Fest 2019. Сергей Корж. Natural Language Processing in .NET.NET Fest 2019. Сергей Корж. Natural Language Processing in .NET
.NET Fest 2019. Сергей Корж. Natural Language Processing in .NET
 
.NET Fest 2019. Eran Stiller. Create Your Own Serverless PKI with .NET & Azur...
.NET Fest 2019. Eran Stiller. Create Your Own Serverless PKI with .NET & Azur....NET Fest 2019. Eran Stiller. Create Your Own Serverless PKI with .NET & Azur...
.NET Fest 2019. Eran Stiller. Create Your Own Serverless PKI with .NET & Azur...
 
.NET Fest 2019. Eran Stiller. 6 Lessons I Learned on My Journey from Monolith...
.NET Fest 2019. Eran Stiller. 6 Lessons I Learned on My Journey from Monolith....NET Fest 2019. Eran Stiller. 6 Lessons I Learned on My Journey from Monolith...
.NET Fest 2019. Eran Stiller. 6 Lessons I Learned on My Journey from Monolith...
 

Recently uploaded

Wound healing PPT
Wound healing PPTWound healing PPT
Wound healing PPT
Jyoti Chand
 
Chapter 4 - Islamic Financial Institutions in Malaysia.pptx
Chapter 4 - Islamic Financial Institutions in Malaysia.pptxChapter 4 - Islamic Financial Institutions in Malaysia.pptx
Chapter 4 - Islamic Financial Institutions in Malaysia.pptx
Mohd Adib Abd Muin, Senior Lecturer at Universiti Utara Malaysia
 
LAND USE LAND COVER AND NDVI OF MIRZAPUR DISTRICT, UP
LAND USE LAND COVER AND NDVI OF MIRZAPUR DISTRICT, UPLAND USE LAND COVER AND NDVI OF MIRZAPUR DISTRICT, UP
LAND USE LAND COVER AND NDVI OF MIRZAPUR DISTRICT, UP
RAHUL
 
Film vocab for eal 3 students: Australia the movie
Film vocab for eal 3 students: Australia the movieFilm vocab for eal 3 students: Australia the movie
Film vocab for eal 3 students: Australia the movie
Nicholas Montgomery
 
Présentationvvvvvvvvvvvvvvvvvvvvvvvvvvvv2.pptx
Présentationvvvvvvvvvvvvvvvvvvvvvvvvvvvv2.pptxPrésentationvvvvvvvvvvvvvvvvvvvvvvvvvvvv2.pptx
Présentationvvvvvvvvvvvvvvvvvvvvvvvvvvvv2.pptx
siemaillard
 
How to Manage Your Lost Opportunities in Odoo 17 CRM
How to Manage Your Lost Opportunities in Odoo 17 CRMHow to Manage Your Lost Opportunities in Odoo 17 CRM
How to Manage Your Lost Opportunities in Odoo 17 CRM
Celine George
 
BÀI TẬP BỔ TRỢ TIẾNG ANH 8 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2023-2024 (CÓ FI...
BÀI TẬP BỔ TRỢ TIẾNG ANH 8 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2023-2024 (CÓ FI...BÀI TẬP BỔ TRỢ TIẾNG ANH 8 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2023-2024 (CÓ FI...
BÀI TẬP BỔ TRỢ TIẾNG ANH 8 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2023-2024 (CÓ FI...
Nguyen Thanh Tu Collection
 
Pengantar Penggunaan Flutter - Dart programming language1.pptx
Pengantar Penggunaan Flutter - Dart programming language1.pptxPengantar Penggunaan Flutter - Dart programming language1.pptx
Pengantar Penggunaan Flutter - Dart programming language1.pptx
Fajar Baskoro
 
The Diamonds of 2023-2024 in the IGRA collection
The Diamonds of 2023-2024 in the IGRA collectionThe Diamonds of 2023-2024 in the IGRA collection
The Diamonds of 2023-2024 in the IGRA collection
Israel Genealogy Research Association
 
RHEOLOGY Physical pharmaceutics-II notes for B.pharm 4th sem students
RHEOLOGY Physical pharmaceutics-II notes for B.pharm 4th sem studentsRHEOLOGY Physical pharmaceutics-II notes for B.pharm 4th sem students
RHEOLOGY Physical pharmaceutics-II notes for B.pharm 4th sem students
Himanshu Rai
 
ISO/IEC 27001, ISO/IEC 42001, and GDPR: Best Practices for Implementation and...
ISO/IEC 27001, ISO/IEC 42001, and GDPR: Best Practices for Implementation and...ISO/IEC 27001, ISO/IEC 42001, and GDPR: Best Practices for Implementation and...
ISO/IEC 27001, ISO/IEC 42001, and GDPR: Best Practices for Implementation and...
PECB
 
ANATOMY AND BIOMECHANICS OF HIP JOINT.pdf
ANATOMY AND BIOMECHANICS OF HIP JOINT.pdfANATOMY AND BIOMECHANICS OF HIP JOINT.pdf
ANATOMY AND BIOMECHANICS OF HIP JOINT.pdf
Priyankaranawat4
 
Cognitive Development Adolescence Psychology
Cognitive Development Adolescence PsychologyCognitive Development Adolescence Psychology
Cognitive Development Adolescence Psychology
paigestewart1632
 
คำศัพท์ คำพื้นฐานการอ่าน ภาษาอังกฤษ ระดับชั้น ม.1
คำศัพท์ คำพื้นฐานการอ่าน ภาษาอังกฤษ ระดับชั้น ม.1คำศัพท์ คำพื้นฐานการอ่าน ภาษาอังกฤษ ระดับชั้น ม.1
คำศัพท์ คำพื้นฐานการอ่าน ภาษาอังกฤษ ระดับชั้น ม.1
สมใจ จันสุกสี
 
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptxNEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
iammrhaywood
 
Walmart Business+ and Spark Good for Nonprofits.pdf
Walmart Business+ and Spark Good for Nonprofits.pdfWalmart Business+ and Spark Good for Nonprofits.pdf
Walmart Business+ and Spark Good for Nonprofits.pdf
TechSoup
 
How to deliver Powerpoint Presentations.pptx
How to deliver Powerpoint  Presentations.pptxHow to deliver Powerpoint  Presentations.pptx
How to deliver Powerpoint Presentations.pptx
HajraNaeem15
 
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
GeorgeMilliken2
 
C1 Rubenstein AP HuG xxxxxxxxxxxxxx.pptx
C1 Rubenstein AP HuG xxxxxxxxxxxxxx.pptxC1 Rubenstein AP HuG xxxxxxxxxxxxxx.pptx
C1 Rubenstein AP HuG xxxxxxxxxxxxxx.pptx
mulvey2
 
Chapter wise All Notes of First year Basic Civil Engineering.pptx
Chapter wise All Notes of First year Basic Civil Engineering.pptxChapter wise All Notes of First year Basic Civil Engineering.pptx
Chapter wise All Notes of First year Basic Civil Engineering.pptx
Denish Jangid
 

Recently uploaded (20)

Wound healing PPT
Wound healing PPTWound healing PPT
Wound healing PPT
 
Chapter 4 - Islamic Financial Institutions in Malaysia.pptx
Chapter 4 - Islamic Financial Institutions in Malaysia.pptxChapter 4 - Islamic Financial Institutions in Malaysia.pptx
Chapter 4 - Islamic Financial Institutions in Malaysia.pptx
 
LAND USE LAND COVER AND NDVI OF MIRZAPUR DISTRICT, UP
LAND USE LAND COVER AND NDVI OF MIRZAPUR DISTRICT, UPLAND USE LAND COVER AND NDVI OF MIRZAPUR DISTRICT, UP
LAND USE LAND COVER AND NDVI OF MIRZAPUR DISTRICT, UP
 
Film vocab for eal 3 students: Australia the movie
Film vocab for eal 3 students: Australia the movieFilm vocab for eal 3 students: Australia the movie
Film vocab for eal 3 students: Australia the movie
 
Présentationvvvvvvvvvvvvvvvvvvvvvvvvvvvv2.pptx
Présentationvvvvvvvvvvvvvvvvvvvvvvvvvvvv2.pptxPrésentationvvvvvvvvvvvvvvvvvvvvvvvvvvvv2.pptx
Présentationvvvvvvvvvvvvvvvvvvvvvvvvvvvv2.pptx
 
How to Manage Your Lost Opportunities in Odoo 17 CRM
How to Manage Your Lost Opportunities in Odoo 17 CRMHow to Manage Your Lost Opportunities in Odoo 17 CRM
How to Manage Your Lost Opportunities in Odoo 17 CRM
 
BÀI TẬP BỔ TRỢ TIẾNG ANH 8 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2023-2024 (CÓ FI...
BÀI TẬP BỔ TRỢ TIẾNG ANH 8 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2023-2024 (CÓ FI...BÀI TẬP BỔ TRỢ TIẾNG ANH 8 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2023-2024 (CÓ FI...
BÀI TẬP BỔ TRỢ TIẾNG ANH 8 CẢ NĂM - GLOBAL SUCCESS - NĂM HỌC 2023-2024 (CÓ FI...
 
Pengantar Penggunaan Flutter - Dart programming language1.pptx
Pengantar Penggunaan Flutter - Dart programming language1.pptxPengantar Penggunaan Flutter - Dart programming language1.pptx
Pengantar Penggunaan Flutter - Dart programming language1.pptx
 
The Diamonds of 2023-2024 in the IGRA collection
The Diamonds of 2023-2024 in the IGRA collectionThe Diamonds of 2023-2024 in the IGRA collection
The Diamonds of 2023-2024 in the IGRA collection
 
RHEOLOGY Physical pharmaceutics-II notes for B.pharm 4th sem students
RHEOLOGY Physical pharmaceutics-II notes for B.pharm 4th sem studentsRHEOLOGY Physical pharmaceutics-II notes for B.pharm 4th sem students
RHEOLOGY Physical pharmaceutics-II notes for B.pharm 4th sem students
 
ISO/IEC 27001, ISO/IEC 42001, and GDPR: Best Practices for Implementation and...
ISO/IEC 27001, ISO/IEC 42001, and GDPR: Best Practices for Implementation and...ISO/IEC 27001, ISO/IEC 42001, and GDPR: Best Practices for Implementation and...
ISO/IEC 27001, ISO/IEC 42001, and GDPR: Best Practices for Implementation and...
 
ANATOMY AND BIOMECHANICS OF HIP JOINT.pdf
ANATOMY AND BIOMECHANICS OF HIP JOINT.pdfANATOMY AND BIOMECHANICS OF HIP JOINT.pdf
ANATOMY AND BIOMECHANICS OF HIP JOINT.pdf
 
Cognitive Development Adolescence Psychology
Cognitive Development Adolescence PsychologyCognitive Development Adolescence Psychology
Cognitive Development Adolescence Psychology
 
คำศัพท์ คำพื้นฐานการอ่าน ภาษาอังกฤษ ระดับชั้น ม.1
คำศัพท์ คำพื้นฐานการอ่าน ภาษาอังกฤษ ระดับชั้น ม.1คำศัพท์ คำพื้นฐานการอ่าน ภาษาอังกฤษ ระดับชั้น ม.1
คำศัพท์ คำพื้นฐานการอ่าน ภาษาอังกฤษ ระดับชั้น ม.1
 
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptxNEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
NEWSPAPERS - QUESTION 1 - REVISION POWERPOINT.pptx
 
Walmart Business+ and Spark Good for Nonprofits.pdf
Walmart Business+ and Spark Good for Nonprofits.pdfWalmart Business+ and Spark Good for Nonprofits.pdf
Walmart Business+ and Spark Good for Nonprofits.pdf
 
How to deliver Powerpoint Presentations.pptx
How to deliver Powerpoint  Presentations.pptxHow to deliver Powerpoint  Presentations.pptx
How to deliver Powerpoint Presentations.pptx
 
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
What is Digital Literacy? A guest blog from Andy McLaughlin, University of Ab...
 
C1 Rubenstein AP HuG xxxxxxxxxxxxxx.pptx
C1 Rubenstein AP HuG xxxxxxxxxxxxxx.pptxC1 Rubenstein AP HuG xxxxxxxxxxxxxx.pptx
C1 Rubenstein AP HuG xxxxxxxxxxxxxx.pptx
 
Chapter wise All Notes of First year Basic Civil Engineering.pptx
Chapter wise All Notes of First year Basic Civil Engineering.pptxChapter wise All Notes of First year Basic Civil Engineering.pptx
Chapter wise All Notes of First year Basic Civil Engineering.pptx
 

.NET Fest 2019. Halil Ibrahim Kalkan. Implementing Domain Driven Design

  • 1. Implementing Domain Driven Design (DDD) a practical guide https://github.com/hikalkan/presentations
  • 2. ABOUT ME Halil İbrahim Kalkan Web: halilibrahimkalkan.com Github: @hikalkan Twitter: @hibrahimkalkan Co-Founder of
  • 3. ASP.NET BOILERPLATE 6+ years continuous development 7.000+ stars on GitHub 1.500.000+ downloads on NuGet https://aspnetboilerplate.com
  • 4. Agenda • Part-I: What is DDD? • Architecture & layers • Execution flow • Building blocks • Common principles • Part-II: Implementing DDD • Layering a Visual Studio solution • Rules & Best Practices • Examples
  • 6. What is DDD? • Domain-driven design (DDD) is an approach to software development for complex needs by connecting the implementation to an evolving model • Focuses on the core domain logic rather than the infrastructure. • Suitable for complex domains and large-scale applications. • Helps to build a flexible, modular and maintainable code base, based on the Object Oriented Programming principles.
  • 7. Domain Driven Design Layers & Clean Architecture Infrastructure Layer Presentation Layer Application Layer Domain Layer
  • 8. Domain Driven Design Core Building Blocks Domain Layer • Entity • Value Object • Aggregate & Aggregate Root • Repository • Domain Service • Specification • … Application Layer • Application Service • Data Transfer Object (DTO) • Unit of Work • …
  • 9. Domain Driven Design Layering in Visual Studio Application Layer Domain Layer Infrastructure Layer Presentation Layer Test Projects • Domain.Shared • IssueConsts • IssueType (enum) • Domain • Issue • IssueManager • IIssueRepository • Application.Contracts • IIssueAppService • IssueDto, IssueCreationDto • Application • IssueAppService (implementation) • Infrastructure / EntityFrameworkCore • EfCoreIssueRepository • MyDbContext • Web • IssueController • IssueViewModel • Issues.cshtml • Issues.js
  • 10. Domain Driven Design Layering in Visual Studio Domain.SharedDomain App.ContractsApplication Web Infrastructure / EntityFrameworkCore
  • 11. Domain Driven Design Execution Flow Application Services Domain Services Entities Repositories (interface) HTTP API MVC UIBrowsers Remote clients DTO DTO HTTP request HTTP request HTML/JSON/js/css JSON DOMAIN layerAPPLICATION layerPRESENTATION layer Distributed Services Layer Authorization Validation Exception Handling Audit Logging Caching Authorization Validation Audit Logging Unit of Work / DB Transaction C R O S S C U T T I N G C O N C E R N S
  • 12. Domain Driven Design Common Principles • Database / ORM independence • Presentation technology agnostic • Doesn’t care about reporting / mass querying • Focuses on state changes of domain objects
  • 14. Aggregates Example Guid Id -------------------------------------- string Text bool IsClosed Enum CloseReason -------------------------------------- Guid RepositoryId Guid AssignedUserId -------------------------------------- ICollection<Comment> ICollection<IssueLabel> Issue (aggregate root) Guid IssueId Guid LabelId IssueLabel (value obj) Guid Id -------------------------------------- string Text DateTime CreationTime -------------------------------------- Guid IssueId Guid UserId Comment (entity) Guid Id -------------------------------------- string Name … … Repository (agg. root) Guid Id -------------------------------------- string UserName string Password … User (agg. root) Guid Id -------------------------------------- string Name string Color … Label (agg. root) Guid Id -------------------------------------- … … Other (entity) Issue Aggregate Repository Aggregate User Aggregate Label Aggregate
  • 15. Aggregate Roots Principles • Saved & retrieved as a single unit (with all sub-collections & all properties) • Should maintain self integrity & validity by implementing domain rules & constraints • Responsible to manage sub entities/objects • An aggregate is generally considered as a transaction boundary. • Should be serializable (already required for NoSQL databases)
  • 16. Aggregate Roots Rule: Reference Other Aggregates only by Id • Don’t define collections to other aggregates! • Don’t define navigation property to other aggregates! • Reference to other aggregate roots by Id.
  • 17. Aggregate Roots Tip: Keep it small Considerations; • Objects used together • Query Performance • Data Integrity & Validity
  • 18. Aggregate Roots / Entities Primary Keys Aggregate Root Define a single Primary Key (Id) Entity Can define a composite Primary Key Suggestion: Prefer GUID as the PK
  • 19. Aggregate Roots & Entities Constructor • Force to create a VALID entity • Get minimum required arguments • Check validity of inputs • Initialize sub collections • Create a private default constructor for ORMs & deserialization • Tip: Get id as an argument, don’t use Guid.NewGuid() inside the constructor • Use a service to create GUIDs
  • 20. Aggregate Roots & Entities Property Accessors & Methods • Maintain object validity • Use private setters when needed • Change properties via methods
  • 21. Aggregate Roots & Entities Business Logic & Exceptions • Implement Business Rules • Define and throw specialized exceptions
  • 22. Aggregate Roots & Entities Business Logic Requires External Services • How to implement when you need external services? • Business Rule: Can not assign more than 3 issues to a user!
  • 23. Aggregate Roots & Entities Business Logic Requires External Services • How to implement when you need external services? • Business Rule: Can not assign more than 3 issues to a user! ALTERNATIVE..? Create a Domain Service!
  • 24. Repositories Principles • A repository is a collection-like interface to interact with the database to read and write entities • Define interface in the domain layer, implement in the infrastructure • Do not include domain logic • Repository interface should be database / ORM independent • Create repositories for aggregate roots, not entities
  • 25. Repositories Do not Include Domain Logic What is an In-Active issue?
  • 26. Repositories Do not Include Domain Logic • Implicit definition of a domain rule! • How to re-use this expression?
  • 27. Repositories Do not Include Domain Logic • Implicit definition of a domain rule! • How to re-use this expression? • Copy/paste? • Solution: The Specification Pattern!
  • 28. Specifications Specification Interface • A specification is a named, reusable & combinable class to filter objects.
  • 29. Specifications Specification Interface • A specification is a named, reusable & combinable class to filter objects.
  • 36. Domain Services Principles • Implements domain logic that; • Depends on services and repositories • Needs to work with multiple entities / entity types • Works with domain objects, not DTOs
  • 37. Domain Services Example Business Rule: Can not assign more than 3 issues to a user
  • 39. Application Services Principles • Implement use cases of the application (application logic) • Do not implement core domain logic • Get & return Data Transfer Objects, not entities • Use domain services, entities, repositories and other domain objects inside
  • 40. Application Services Example • Inject domain services & repositories • Get DTO as argument • Get aggregate roots from repositories • Use domain service to perform the domain logic • Always update the entity explicitly (don’t assume the change tracking)
  • 41. Application Services Common DTO Principles Best Practices • Should be serializable • Should have a parameterless constructor • Should not contain any business logic • Never inherit from entities! Never reference to entities!
  • 42. Application Services Input DTO Best Practices • Define only the properties needed for the use case • Do not reuse same input DTO for multiple use cases (service methods) • Id is not used in create! Do not share same DTO for create & update! • Password is not used in Update and ChangeUserName! • CreationTime should not be sent by the client!
  • 43. Application Services Input DTO Best Practices • Define only the properties needed for the use case • Do not reuse same input DTO for multiple use cases (service methods)
  • 44. Application Services Input DTO Best Practices • Implement only the formal validation (can use data annotation attributes) • Don’t include domain validation logic (ex: unique user name constraint)
  • 45. Application Services Output DTO suggestions • Keep output DTO count minimum. Reuse where possible (except input DTOs as output DTO). • Can contain more properties than client needs • Return the entity DTO from Create & update methods. • Exception: Where performance is critical, especially for large result sets.
  • 47. Application Services Object to Object Mapping • Use auto object mapping libraries (but, carefully – enable configuration validation) • Do not map input DTOs to entities. • Map entities to output DTOs
  • 48. Application Services Example: Entity Creation & DTO Mapping • Don’t use DTO to entity auto- mapping, use entity constructor. • Perform additional domain actions. • Use repository to insert the entity. • Return DTO using auto-mapping.
  • 49. Multiple Application Layers Domain Layer Back Office Application Layer Public Web Application Layer Mobile Application Layer Mobile APIMVC UIREST API SPA Browser Mobile App • Create separate application layers for each application type. • Use a single domain layer to share the core domain logic.
  • 50. Application Logic & Domain Logic Examples..? Business Logic Application Logic (Use Cases) Domain Logic
  • 51. Application Logic & Domain Logic • Don’t create domain services to perform simple CRUD operations! • Use Repositories in the application services. • Never pass DTOs to or return DTOs from domain services! • DTOs should be in the application layer.
  • 52. Application Logic & Domain Logic • Domain service should check duplicate organization name. • Domain service doesn’t perform authorization! • Do in the application layer! • Domain service must not depend on the current user! • Do in the application/UI/API layer! • Domain service must not send email that is not related to the actual business! • Do in the application layer or implement via domain events.
  • 53. Application Logic & Domain Logic • Application service methods should be a unit of work (transactional) if contains more than one database operations. • Authorization is done in the application layer. • Payment (infrastructure service) and Organization creation should not be combined in the domain layer. Should be orchestrated by the application layer. • Email sending can be done in the application service. • Do not return entities from application services! • Why not moving payment logic inside the domain service?
  • 54. Reference Books Domain Driven Design Eric Evans Implementing Domain Driven Design Vaughn Vernon Clean Architecture Robert C. Martin
  • 55. Thanks..! Questions..? Halil İbrahim Kalkan • http://halilibrahimkalkan.com • GitHub @hikalkan • Twitter @hibrahimkalkan Presentation: https://github.com/hikalkan/presentations