Upload
enea-gabriel
View
8.341
Download
7
Embed Size (px)
DESCRIPTION
This is a presentation about the new Domain Driven Design architecture in combination with ASP.NET MVC 3 and Entity Framework 4.1 CodeFirst tools.The session was part of the IT Camp 2011 event (http://www.itcamp.ro).
Citation preview
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
Elements of DDD with ASP.NET MVC &
Entity Framework Code First Gabriel ENEA, Technical Director
MAXCODE.nl
Co-founder Joobs.ro – the first IT job portal in Romania
CodeCamp member / Iași [email protected] / gabrielenea.blogspot.com / @dotnet18
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
IT Camp 2011
• Thanks for coming!
• ITCamp is made possible by our sponsors:
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
Agenda
# Unit Testing challenges
# Today Architectural Design
# New approach: Domain-Driven-Design
# Today’s Tools (@web)
# Demo
• Q&A
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
DEMO
Application requirements
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
UNIT TESTING CHALLENGES
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
How do you test it?
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
Testing on components
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
How do you start building an application architecture?
Focus on?
• building an architecture from scratch
• thinking about how to achieve unit testing
• start with modeling the database schema and data relations
• using drag & drop programming
• modeling the domain entities, relations, business rules
• reusing existing code?
• but, in the end, do you achieve 99,99% test code coverage?
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
Is unit testing achievable? 100%?
Yes or No? Who knows?
Maybe not! Possible answers:
• The customer doesn't understand this need
• Neither the management staff
• Instead, everyone expects you to write the perfect code
• As developers, every time we say: we need time to do it right!
• But, do we need time or we don't know how to achieve it?
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
TODAY ARCHITECTURAL DESIGN
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
Let's start thinking to architecture design
What? Right, now!?
Hey, we have only 1 hour to finish this presentation!
Indeed, but let's try to do something!
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
What stops 100% unit testing?
1. Layers
– How do we design them?
2. Business rules
– Where and how do we implement?
3. Persistence
– Should we use an ORM?
…
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
1 - Layers
Data Access
Business
Presentation
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
Data Access
Business
Presentation
1 - Layers – any problems?
Layers Coupling!
A strong coupling conducts to a hard way to do:
– unit testing
– refactoring
– agile development
– or be opened for changes
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
2 - Business rules
Where should these be located?
– Database
– Business layer
– User Interface (aka code behind!)
How do we test them?
– Running the application
– Automatically, maybe using unit tests
– Or we should let the customer test them!?
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
And...what's inappropriate here?
// somewhere in the business layer
public class Patient {
public DateTime Birthdate { get; set; }
public int Age { // computed value
get {
return DateTime.Now.Year - this.Birthdate.Year;
}
}
public bool IsAdult { // business rule
get {
return this.Age >= 18;
}
}
...
Strong coupling!
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
3 - Persistence
Requirements
• Persistence Ignorance / POCO
• Help Domain Model stay out of infrastructure stuff
• Decide where to store data (NoSQL?)
• Use code generation or an Object Relation (O/R) Mapper – Metadata mapping
• Support for the Unit of Work pattern
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
NEW APPROACH: DDD
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
Let's start with a new approach... Domain-Driven-Design
• What is Domain?
A new default architecture where:
• the database is not the first focus
• the layers are loosely coupled
• the business rules are within the application Domain
• it is easier to achieve unit testing
• Why? Today we have the tools!
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
A new default architecture - DDD
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
Building blocks of DDD
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
TODAY'S TOOLS
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
Today's tools (from a web developer perspective)
Dependency Injection frameworks
– Manage dependencies
– Castle Windsor, StructureMap, Spring.NET, Unity, ...
ASP.NET MVC 3
– a mature web development platform based on MVC pattern
Entity Framework 4.1 Code First / NHibernate
– helps you focus on your domain
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
What is Dependency Injection?
• = DI.Equals(IoC); // true or false?
• IoC = Inversion of Control
• DI = Dependency Injection
• Helps you to decouple the application dependencies
– Logging mechanisms (log4net, Enterprise Library Logging Application Block, ...)
– Persistence mechanism (direct access to database, ORM)
– User Interface dependencies on Domain services
– Layers
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
Dependency Injection
PatientService
Log4netLogger
PatientRepositoy
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
Dependency Injection
Builder PatientService
Log4netLogger
ILogger
3) uses 2) inject dependencies
1) creates
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
ASP.NET MVC 3 and DI support
• Based on MVC pattern
• Provides better support for IoC – Views/Controllers
• Model Validation support
• Check IDependencyResolver interface – simplify service location and dependency resolution
TService GetService<TService>() { … }
IEnumerable<TService> GetServices<TService>() { … }
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
Persistance with EF 4.1 CodeFirst
1st version benefits:
• CodeFirst development
• Better POCO support
• Mapping based on predefined conventions
(Convention over configuration)
• Fluent API for manual mapping entities to tables, no more .edmx files
• Built-in Model-Level Validation
• Dynamic database creation and dropping
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
DEMO
DDD architecture with ASP.NET MVC 3, Unity, Entity Framework CodeFirst 4.1
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
Conclusions
Focus on
– Analyze application dependencies
– Business rules
– Do refactoring!
– Design your Domain
– Don’t forget to do Unit testing
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
Resources
Books
• Domain-Driven Design, Tackling Complexity in the Heart of Software, by Eric Evans
• Applying Domain-Driven Design and Patterns, With Examples in C# and .NET, by Jimmy Nilsson
Online resources
• http://domaindrivendesign.org/
• http://www.infoq.com/minibooks/domain-driven-design-quickly
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
Q&A
Elements of DDD with ASP.NET MVC & Entity Framework Code First
@itcampro / #itcampro Premium conference on Microsoft’s Dev and ITPro technologies
Don’t forget!
Get your free Azure pass!
• 30+15 days, no CC req’d
– http://bit.ly/ITCAMP11
– Promo code: ITCAMP11
We want your feedback!
• Win a WP7 smartphone
– Fill in your feedback forms
– Raffle: end of the day