SlideShare a Scribd company logo
Epic.NET: Processes, patterns and architectures
Processes, patterns and architectures

      http://epic.tesio.it/
         giacomo@tesio.it
Pro cess

✔   Choose DDD
✔   Find Domain Experts
✔   Choose Modelers
✔   Discover Contexts
✔   Distill Languages
✔   DevPool.Start(...)
✔   Measure
Ch oose D.D.D.
✔   Cool? Just expensive!
✔   Requires experience
✔   For applications
      business critical
      operative
      complex beyond tech
✔   Not for
      data driven apps
      vendor-driven teams
Wh o needs an Expert?
Ch oose a Modeler
✔   Humble                  ✔   Out of touch devs
✔   Motivated               ✔   Inexperienced devs
✔   Smart                   ✔   Technologists
✔   Fearless                ✔   Hackers
✔   Really skilled in OOP   ✔   Unmotivated people
✔   Diligent                ✔   Sociopathics
✔   Comunicative            ✔   Leaving company
✔   Responsible             ✔   Yielding people
    (responsum abilem)
D i s c ov e r th e Cont ex t s

  Creative               ✔   Identify the Core
Collaboration            ✔   Identify supporting
                             contexts
 Domain Expert
 (Business Experience)   ✔   Name each context
          vs                   think to namespaces
     Modeler             ✔   git add VISION.txt
 (Development Needs)
                             (vision statement)
                         ✔   Look for dependencies
Track Decisions!
                         ✔   Schedule works
Distill Languages
✔   Bounded Context → Point of View / Language
✔   Context Name        → Namespace (Project?)
✔   Distill Language    → Write Contracts (POCO)




                                                            ITERATE ! ! !
       Entities, Value Objects, Services +
       Events & Exceptions (no checked exceptions in C#!)
✔   Share with clients → Look for questions
             (devs & archs)    and feedbacks!!!
✔   Dwelve into (until the model is clear to the team)

                 OUTPUT CODE ! ! !
                           (well documented)
D e v Po o l . S t a r t ( . . . )
Once a Context is ready and known to the team, the
related development tasks can START.


You can parallelize (with or without Epic):
✔   Infrastructure (persistence, log, bus, cache...)
✔   User Interface (a good MVP framework can help here)
✔   Exposed Services (Soap / ReST / WCF...)


Meanwhile modelers can distill the next context.
Measure (to estimate)
✔   Customer feedbacks                Look For
✔   # / € of Bugs
                             ✔   Global Optimum
✔   Modeling Effort
                             ✔   Explicitness/Precision
✔   Development Effort
                             ✔   Shared Languages
✔   Breakthroughs
                             ✔   Fast Evolution




                             !
✔   Refactorings
                                  Analyze Failures
✔   Parallelization issues
                                          to
✔   Reuse opportunities
                                    Reduce Risks
Pa t t e r n s
✔   Plain old C# Objects            Shared
✔   Bounded Roles               modeling grammar
✔   Shared Identifiers     Born from experience
✔   CQS & Idempotence       ✔   work together
                                  they help each other
✔   Observable Entities
                            ✔   reliable
✔   SOLID Principles              most valuable asset here
✔   Linq Repositories       ✔   complete the blue book
✔   Single Mutable State          lower the learning curve
                                  standardize modelers' skills

    http://epic.tesio.it/doc/manual.html
●
       Plain old C# Objects
           Aim for                           Avoid
✔   Nothing but business         ✔   Framework-like naming
      Keep it simple                 conventions
      Consistent for Experts     ✔   Your own abstractions
✔   Typed explicitness           ✔   Technological
      Declarative: bits are          dependencies
      cheaper than bugs!
                                       Explicit: dll reference
✔   Stable contracts                   Implicit: virtual members
      Interfaces, Identifiers,   ✔   To worry about db
      EventArgs, Exceptions
Bounded Roles
      ✔   Points of view
            Partition complexity
            Keep the language
            consistent and simple
            Require translations
      ✔   Often present in U.L.
      ✔   Explicit access rules
      ✔   Are junction points
            Belong to Model
            Belong to Infrastructure
S h a r e d I d e n t i fi e r s
✔   Concrete Contracts
      Immutable
      Strongly typed
      !(string || long)
      Validate in constructor
      Key in Identity Maps
✔   Decouple entities                 SHARED ! ! !
✔   Decouple contexts           ✔   Between players
✔   Avoid naming                ✔   Between layers
    conventions                 ✔   Between contexts (often)
C.Q.S. & Idemp otence
          Commands                             Queries
✔   Void Imperative                ✔   Return value
       (out params, if needed)     ✔   Free from side-effect
✔   Have side-effects              ✔   Failures are bugs!
✔   Throw Typed Exceptions         ✔   Thread safe (easily?)
✔   Fire Events (properly)               (V.O.'s Factories here!)
     (Entities' Factories here!)


          Neither should change the arguments!
    Both should be IDEMPOTENT (this = 1st operand)
Observable Entities
    Identity    Evolution           No Domain Events?
                                ✔   Implicit
C# as reporter                        need to read the code
                                ✔   A bit Java oriented
✔   Who? The Sender!
                                ✔   Wait, we have them!
✔   What? Event Name
                                      You just need an observer
      most of times, contains         inside repository or
      a verb in past tense            Epic.Server
✔   Where? EventArgs!
✔   When? On callback!                 What's about
                                       Earthquakes?
✔   Why? Decoupling.
Single Resp onsibility
                The One Reason
           ✔   Business evolution
           ✔   deeper insights
           ✔   bug fixes

           Split contexts properly
           Forget # of methods
           No “helper” overloads!
Open - Closed
✔   Well bounded contexts
✔   Small design decisions
      Template methods (!)
      SerializableAttribute
      Single Mutable State

    Allow Binary Reuse

    Break (with Branch)
     on Deeper Insight
Li s kov S u b st it ut io n
              ✔   Always forgot
              ✔   Concerns abstractions
              ✔   Easy... if you don't
                  abstract on your own
                    small inheritance depth
                    (most of times...)
              ✔   Developers hate it
                  (until debug)
                    What's about events?
                    And exceptions?
I n t e r fa c e S e g r e g at i o n
✔   Clear Contexts == Small Classes

✔   Anti-corruption layers (domain services)
✔   Shared kernels
      contain contracts only
      with or without a role
      should emerge from existing code
      should be carefully analized (no “coding convention”)
✔   Avoid multiple inheritance
      different interfaces == divergent evolutions
D e p e nde nc y Inv e rs ion
a)High-level modules                  Domain Models
  should not depend on                Contracts       Code
  low-level modules.                     (highest levels)
  Both should depend on
  abstractions.                       Any thing else
b)Abstractions should not       ✔   Persistence
  depend on details.            ✔   User Interfaces
  Details should depend
  on abstractions.              ✔   Infrastructure
     –   Robert Martin (2002)         Epic itself is replaceable
                                          (lower levels)
Lin q Re p os ito r ie s
✔   Generic Repositories              IQueryable<TEntity>
      Consistent API              ✔   Explicit (and complete)
       –   Select<T>(QueryObj)
                                        stable and consistent
       –   Save<T>(T)      (?!)
                                        needs declarative types
       –   Delete<T>(T)    (?!)
      Easy with O/RM
                                  ✔   Decouple
      IMPLICIT! ! !                     clients ignore executors
✔   Custom repositories                 can inject infrastructure

      explicit interfaces (pro)
                                  ✔   Derive IRepository<T>
      harder to maitain (cons)          ease versioning
                                        can blend to custom rep
Single Mutable State
✔   Optional design pattern for entities
      preserves the model expressivity
      allows concurrent access to entities
✔   Fine grained locks
      a single field contain the state
      the state
       –   is immutable
       –   replicate entity's api but instead of void returns next state
      on command: execute, compare & swap
✔   Designed for Epic.Server
      a “transparent” CQRS grid, at need
A r chit e c t ure s
    Technological req.                    Business req.
✔   Modularization                 ✔   MiFID (2004, 2006... 2011?)
      binary reuse (up to views)          complex financial rules
      decoupled cooperation               on human processes
✔   High scalability                      “implemented” by banks
                                          “strict” compliance
✔   Easy integration               ✔   Dispatch orders!
          ●   SOA is not enough!
                                          Sync with trading online


                      No Ring to rule them all!
Ch oosing th e Business
✔   We decided to protect the Domain Knowledge
      customers find techicalities weird
      customers love who talk their language
✔   Looking for perceptible excellence
      we want to compete on value instead of price
      we want to build custom applications
       –   rapidly adapted to the customers' environments and needs
       –   on top of stable products (and assemblies)



      We built a set of brand-new tools!
Innovation & Risk
      Frameworks are Risky Investments!
✔   P = f(D) + f(A)
      P = productivity gain
      f = architects' skills
            ● technical, social, economic


      D = investment in design & development (doc & edu included)
      A = alternatives' evaluation


Found no alternatives?
Build next Secret Weapon!
1)   3-tiers
2 ) M i c r o s o ft D D D N - L a y e r
2 ) M i c r o s o ft D D D N - L a y e r
3)   Onion Architecture
Th e Dai s y Ar chit e c t ure
Th e Dai s y Ar chit e c t ure
Th e Dai s y Ar chit e c t ure
Dress the Model
    ...with Epic's petals!
✔   Epic.Linq
      Composable Query Provider
✔   Epic.Proxy
      More than AOP
✔   Epic.Poem
      Asp.NET, WPF, MonoTouch
✔   Epic.Security
✔   Epic.Server
      Transparent CQRS/ES
An Epic Investment
✔   Technically challenging
✔   Estimated ~ 400.000 €
      dual-licensing model
✔   Still Work in Progress
      15% done in one year
      Looking for developers
✔   Target niche markets
      DDD applications only
      For skilled OOP devs
      World wide
Thanks!

http://epic.tesio.it/
   giacomo@tesio.it

More Related Content

PPTX
Developer Friendly API Design
PPTX
DevOps for CTOs
PPTX
BDD in DDD
PPTX
Domain Model e SOA (Service Oriented Architecture)
KEY
DDD 2011 - Dove Desideriamo Dirigerci
PPTX
Introduzione al Domain Driven Design (DDD)
PDF
How I did it (in .NET): idiomatic Domain Driven Design
PDF
DDD e Validazione
Developer Friendly API Design
DevOps for CTOs
BDD in DDD
Domain Model e SOA (Service Oriented Architecture)
DDD 2011 - Dove Desideriamo Dirigerci
Introduzione al Domain Driven Design (DDD)
How I did it (in .NET): idiomatic Domain Driven Design
DDD e Validazione

Similar to Epic.NET: Processes, patterns and architectures (20)

PDF
Smart Client Development
PDF
Framework Engineering
PDF
Writing good C# code for good cloud applications - Draft Oct 20, 2014
PDF
From class to architecture
PDF
Aggregates, Entities and Value objects - Devnology 2010 community day
PDF
Framework Engineering_Final
PPT
Domain Driven Design Demonstrated
PPTX
Dependency injection
PPTX
Seminar - Scalable Enterprise Application Development Using DDD and CQRS
PPTX
Pragmatic Approach to Microservices and Cell-based Architecture
PPT
Domain driven design
PPTX
Common ASP.NET Design Patterns - Telerik India DevCon 2013
PPTX
Overview Of .Net 4.0 Sanjay Vyas
PDF
Design Pattern Cheatsheet
PPT
UnifedModeeqwewqeqweqwewqewqelingLanguage.ppt
PPTX
Framework engineering JCO 2011
PPTX
Domain driven design
PPTX
Evolution of Patterns
PPTX
Unit 1- OOAD ppt
DOC
10266 developing data access solutions with microsoft visual studio 2010
Smart Client Development
Framework Engineering
Writing good C# code for good cloud applications - Draft Oct 20, 2014
From class to architecture
Aggregates, Entities and Value objects - Devnology 2010 community day
Framework Engineering_Final
Domain Driven Design Demonstrated
Dependency injection
Seminar - Scalable Enterprise Application Development Using DDD and CQRS
Pragmatic Approach to Microservices and Cell-based Architecture
Domain driven design
Common ASP.NET Design Patterns - Telerik India DevCon 2013
Overview Of .Net 4.0 Sanjay Vyas
Design Pattern Cheatsheet
UnifedModeeqwewqeqweqwewqewqelingLanguage.ppt
Framework engineering JCO 2011
Domain driven design
Evolution of Patterns
Unit 1- OOAD ppt
10266 developing data access solutions with microsoft visual studio 2010
Ad

Recently uploaded (20)

PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
NewMind AI Monthly Chronicles - July 2025
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
KodekX | Application Modernization Development
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Electronic commerce courselecture one. Pdf
“AI and Expert System Decision Support & Business Intelligence Systems”
Diabetes mellitus diagnosis method based random forest with bat algorithm
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Building Integrated photovoltaic BIPV_UPV.pdf
20250228 LYD VKU AI Blended-Learning.pptx
Review of recent advances in non-invasive hemoglobin estimation
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Mobile App Security Testing_ A Comprehensive Guide.pdf
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
NewMind AI Monthly Chronicles - July 2025
Understanding_Digital_Forensics_Presentation.pptx
Digital-Transformation-Roadmap-for-Companies.pptx
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
KodekX | Application Modernization Development
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Electronic commerce courselecture one. Pdf
Ad

Epic.NET: Processes, patterns and architectures

  • 2. Processes, patterns and architectures http://epic.tesio.it/ giacomo@tesio.it
  • 3. Pro cess ✔ Choose DDD ✔ Find Domain Experts ✔ Choose Modelers ✔ Discover Contexts ✔ Distill Languages ✔ DevPool.Start(...) ✔ Measure
  • 4. Ch oose D.D.D. ✔ Cool? Just expensive! ✔ Requires experience ✔ For applications business critical operative complex beyond tech ✔ Not for data driven apps vendor-driven teams
  • 5. Wh o needs an Expert?
  • 6. Ch oose a Modeler ✔ Humble ✔ Out of touch devs ✔ Motivated ✔ Inexperienced devs ✔ Smart ✔ Technologists ✔ Fearless ✔ Hackers ✔ Really skilled in OOP ✔ Unmotivated people ✔ Diligent ✔ Sociopathics ✔ Comunicative ✔ Leaving company ✔ Responsible ✔ Yielding people (responsum abilem)
  • 7. D i s c ov e r th e Cont ex t s Creative ✔ Identify the Core Collaboration ✔ Identify supporting contexts Domain Expert (Business Experience) ✔ Name each context vs think to namespaces Modeler ✔ git add VISION.txt (Development Needs) (vision statement) ✔ Look for dependencies Track Decisions! ✔ Schedule works
  • 8. Distill Languages ✔ Bounded Context → Point of View / Language ✔ Context Name → Namespace (Project?) ✔ Distill Language → Write Contracts (POCO) ITERATE ! ! ! Entities, Value Objects, Services + Events & Exceptions (no checked exceptions in C#!) ✔ Share with clients → Look for questions (devs & archs) and feedbacks!!! ✔ Dwelve into (until the model is clear to the team) OUTPUT CODE ! ! ! (well documented)
  • 9. D e v Po o l . S t a r t ( . . . ) Once a Context is ready and known to the team, the related development tasks can START. You can parallelize (with or without Epic): ✔ Infrastructure (persistence, log, bus, cache...) ✔ User Interface (a good MVP framework can help here) ✔ Exposed Services (Soap / ReST / WCF...) Meanwhile modelers can distill the next context.
  • 10. Measure (to estimate) ✔ Customer feedbacks Look For ✔ # / € of Bugs ✔ Global Optimum ✔ Modeling Effort ✔ Explicitness/Precision ✔ Development Effort ✔ Shared Languages ✔ Breakthroughs ✔ Fast Evolution ! ✔ Refactorings Analyze Failures ✔ Parallelization issues to ✔ Reuse opportunities Reduce Risks
  • 11. Pa t t e r n s ✔ Plain old C# Objects Shared ✔ Bounded Roles modeling grammar ✔ Shared Identifiers Born from experience ✔ CQS & Idempotence ✔ work together they help each other ✔ Observable Entities ✔ reliable ✔ SOLID Principles most valuable asset here ✔ Linq Repositories ✔ complete the blue book ✔ Single Mutable State lower the learning curve standardize modelers' skills http://epic.tesio.it/doc/manual.html
  • 12. Plain old C# Objects Aim for Avoid ✔ Nothing but business ✔ Framework-like naming Keep it simple conventions Consistent for Experts ✔ Your own abstractions ✔ Typed explicitness ✔ Technological Declarative: bits are dependencies cheaper than bugs! Explicit: dll reference ✔ Stable contracts Implicit: virtual members Interfaces, Identifiers, ✔ To worry about db EventArgs, Exceptions
  • 13. Bounded Roles ✔ Points of view Partition complexity Keep the language consistent and simple Require translations ✔ Often present in U.L. ✔ Explicit access rules ✔ Are junction points Belong to Model Belong to Infrastructure
  • 14. S h a r e d I d e n t i fi e r s ✔ Concrete Contracts Immutable Strongly typed !(string || long) Validate in constructor Key in Identity Maps ✔ Decouple entities SHARED ! ! ! ✔ Decouple contexts ✔ Between players ✔ Avoid naming ✔ Between layers conventions ✔ Between contexts (often)
  • 15. C.Q.S. & Idemp otence Commands Queries ✔ Void Imperative ✔ Return value (out params, if needed) ✔ Free from side-effect ✔ Have side-effects ✔ Failures are bugs! ✔ Throw Typed Exceptions ✔ Thread safe (easily?) ✔ Fire Events (properly) (V.O.'s Factories here!) (Entities' Factories here!) Neither should change the arguments! Both should be IDEMPOTENT (this = 1st operand)
  • 16. Observable Entities Identity Evolution No Domain Events? ✔ Implicit C# as reporter need to read the code ✔ A bit Java oriented ✔ Who? The Sender! ✔ Wait, we have them! ✔ What? Event Name You just need an observer most of times, contains inside repository or a verb in past tense Epic.Server ✔ Where? EventArgs! ✔ When? On callback! What's about Earthquakes? ✔ Why? Decoupling.
  • 17. Single Resp onsibility The One Reason ✔ Business evolution ✔ deeper insights ✔ bug fixes Split contexts properly Forget # of methods No “helper” overloads!
  • 18. Open - Closed ✔ Well bounded contexts ✔ Small design decisions Template methods (!) SerializableAttribute Single Mutable State Allow Binary Reuse Break (with Branch) on Deeper Insight
  • 19. Li s kov S u b st it ut io n ✔ Always forgot ✔ Concerns abstractions ✔ Easy... if you don't abstract on your own small inheritance depth (most of times...) ✔ Developers hate it (until debug) What's about events? And exceptions?
  • 20. I n t e r fa c e S e g r e g at i o n ✔ Clear Contexts == Small Classes ✔ Anti-corruption layers (domain services) ✔ Shared kernels contain contracts only with or without a role should emerge from existing code should be carefully analized (no “coding convention”) ✔ Avoid multiple inheritance different interfaces == divergent evolutions
  • 21. D e p e nde nc y Inv e rs ion a)High-level modules Domain Models should not depend on Contracts Code low-level modules. (highest levels) Both should depend on abstractions. Any thing else b)Abstractions should not ✔ Persistence depend on details. ✔ User Interfaces Details should depend on abstractions. ✔ Infrastructure – Robert Martin (2002) Epic itself is replaceable (lower levels)
  • 22. Lin q Re p os ito r ie s ✔ Generic Repositories IQueryable<TEntity> Consistent API ✔ Explicit (and complete) – Select<T>(QueryObj) stable and consistent – Save<T>(T) (?!) needs declarative types – Delete<T>(T) (?!) Easy with O/RM ✔ Decouple IMPLICIT! ! ! clients ignore executors ✔ Custom repositories can inject infrastructure explicit interfaces (pro) ✔ Derive IRepository<T> harder to maitain (cons) ease versioning can blend to custom rep
  • 23. Single Mutable State ✔ Optional design pattern for entities preserves the model expressivity allows concurrent access to entities ✔ Fine grained locks a single field contain the state the state – is immutable – replicate entity's api but instead of void returns next state on command: execute, compare & swap ✔ Designed for Epic.Server a “transparent” CQRS grid, at need
  • 24. A r chit e c t ure s Technological req. Business req. ✔ Modularization ✔ MiFID (2004, 2006... 2011?) binary reuse (up to views) complex financial rules decoupled cooperation on human processes ✔ High scalability “implemented” by banks “strict” compliance ✔ Easy integration ✔ Dispatch orders! ● SOA is not enough! Sync with trading online No Ring to rule them all!
  • 25. Ch oosing th e Business ✔ We decided to protect the Domain Knowledge customers find techicalities weird customers love who talk their language ✔ Looking for perceptible excellence we want to compete on value instead of price we want to build custom applications – rapidly adapted to the customers' environments and needs – on top of stable products (and assemblies) We built a set of brand-new tools!
  • 26. Innovation & Risk Frameworks are Risky Investments! ✔ P = f(D) + f(A) P = productivity gain f = architects' skills ● technical, social, economic D = investment in design & development (doc & edu included) A = alternatives' evaluation Found no alternatives? Build next Secret Weapon!
  • 27. 1) 3-tiers
  • 28. 2 ) M i c r o s o ft D D D N - L a y e r
  • 29. 2 ) M i c r o s o ft D D D N - L a y e r
  • 30. 3) Onion Architecture
  • 31. Th e Dai s y Ar chit e c t ure
  • 32. Th e Dai s y Ar chit e c t ure
  • 33. Th e Dai s y Ar chit e c t ure
  • 34. Dress the Model ...with Epic's petals! ✔ Epic.Linq Composable Query Provider ✔ Epic.Proxy More than AOP ✔ Epic.Poem Asp.NET, WPF, MonoTouch ✔ Epic.Security ✔ Epic.Server Transparent CQRS/ES
  • 35. An Epic Investment ✔ Technically challenging ✔ Estimated ~ 400.000 € dual-licensing model ✔ Still Work in Progress 15% done in one year Looking for developers ✔ Target niche markets DDD applications only For skilled OOP devs World wide