Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Cold box hierarchical mvc

41 views

Published on

Luis Majano

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Cold box hierarchical mvc

  1. 1. Hierarchical MVC Transform your Monolith
  2. 2. WHO AM I? • Luis Majano - Computer Engineer • Imported from El Salvador • Houston,Texas • CEO of Ortus Solutions • Creator of many boxes www.ortussolutions.com @ortussolutions @lmajano
  3. 3. AGENDA • The Legacy Problem • Monolithic Applications • HMVC Architecture • ColdBox Modules • API Demo
  4. 4. “Software is always bound to change”
  5. 5. THE LEGACY PROBLEM
  6. 6. LEGACY PROBLEM • Gives CFML a bad name • Security Issues • Performance Issues • Employee Issues • Development Issues • Finding Developer Issues
  7. 7. LEGACY PROBLEM •>35% No MVC •>60% No DI •>55% No Testing FuseBox is NOT MVC
  8. 8. LIKE MY CFML APP? • MVC Framework or spaghetti hell? • OO or cfinclude hell? • Automated Tests? Continuous Integration? • Agile/Scrum Methodologies? • Source Control? (Zip files don’t count!) • Continuous Delivery? Container Strategy? • Developer Automation?
  9. 9. Monolithic Apps
  10. 10. HOW DO WE MODERNIZE CFML?
  11. 11. BACK TO THE SCHOOL OF ARCHITECTURE
  12. 12. 1. COHESION - COUPLING
  13. 13. 2. MVC • Separates layers of concerns • Helps enforce OO • Specialized team members • but • Layers are still tightly coupled • MVC Monoliths
  14. 14. 3. N-TIER - MEXICAN CHALUPA • Add more layers for organization • Layers are still tightly coupled • Still monolithic!
  15. 15. 4. HMVC
  16. 16. 4. HMVC • Evolution of MVC • No more lasagna • Independent MVCTriads • Benefits • Higher Cohesion • Lower Coupling • Modularization • Better Organization • Reusability • Extensibility • Testability
  17. 17. 5. MICROSERVICES AN APPROACH TO DEVELOPING A SINGLE APPLICATION AS A SUITE OF SMALL SERVICES, EACH RUNNING IN ITS OWN PROCESS AND COMMUNICATING WITH LIGHTWEIGHT MECHANISMS. Martin Fowler
  18. 18. 5. MICROSERVICES M C V M C V M C V
  19. 19. • Legacy code updates less intimidating • Fault tolerance • Versionable & Maintainable • Short release cycles • Monoliths Evolution 5. MICROSERVICES Identify Break Out Scale
  20. 20. COMMANDBOX-DOCKER Run any CFML Engine Run any WAR Portable Server Settings Portable CFML Engine Settings Image Healthchecks Secure Headless Modes
  21. 21. HMVC Microservices + FORMULA FOR SUCCESS
  22. 22. A FUNDAMENTAL CHANGE IN APPROACH OR UNDERLYING ASSUMPTIONS. PARADIGM SHIFT: MODERNIZE…
  23. 23. Monolithic) App) App#Security# Billing# Blog# Cart# User# Admin# EVOLVETO 
 HMVC MODULARITY “As a system evolves, It’s complexity will increase unless work is done to maintain or reduce it.” 
 Lehman’s 2nd Law of software evolution
  24. 24. WHAT IS A MODULE? "In structured design and data-driven design, a module is a generic term used to describe a named and addressable group of program statements” 
 by Craig Borysowich (ChiefTechnologyTactician) “A software module is a deployable, manageable, natively reusable, composable, unit of software that provides a concise interface to consumers.” 
 by Kirk Knoernschild
  25. 25. COLDBOX MODULES = SUPER POWERS • Mini MVC applications • Addressable • Composed • Dependencies • Runtime Installed • Reloaded • Unloaded
  26. 26. COLDBOX MODULES ARE OLD Available since v3.0.0 (2011)
  27. 27. COLDBOX MODULETRIADS Host%Application% Security% News% RSS% eStore% Admin% Users% Comments% Posts% Billing%
  28. 28. WHAT DOYOU GET? • MVC Conventions • Automatic Model Mappings (DI) • Automatic CFML Mappings • Automatic URL Routing • Automatic Interceptors • Overridable Settings • Environment Detection • Module Dependencies
  29. 29. ColdBox MVC Application handlers layouts models modules views box.json modules_app Tracked by CommandBox Custom
  30. 30. Anatomy of a Module ModuleConfig.cfc handlers layouts models modules modules_app Module Name
 (unique on disk) box.json views
  31. 31. { "name":"cbSwagger-shell", "version":"1.1.0", "slug":"cbSwagger-shell", "private":false, "dependencies":{ "coldbox":"^4.3.0", “workbench":"git+https://github.com/ortus/unified-workbench.git", "cbjavaloader":">1.0.0", "swagger-sdk":">0.0.9" }, "devDependencies":{ "testbox":"^2.4.0" }, "installPaths":{ "coldbox":"coldbox/", "testbox":"testbox/", "cbjavaloader":"modules/cbjavaloader/", "swagger-sdk":"modules/swagger-sdk/", "workbench":"workbench" }, "testbox":{ "runner":"http://localhost:49616" }, "scripts":{ "postVersion":"recipe workbench/bump.boxr" } } box.json
  32. 32. MODULECONFIG.CFC • Simple CFC • Bootstraps your module • Must exist in the root of your module folder • Has public properties • Callback methods • Tier-detection enabled • It’s an interceptor too!
  33. 33. MODULECONFIG.CFC PROPERTIES // Module Properties     this.title              = "cbswagger";     this.author             = "Jon Clausen <jon_clausen@silowebworks.com>";     this.webURL             = "https://github.com/coldbox-modules/cbSwagger";     this.description        = "Swagger API documentation from your routes";     this.version            = "@build.version@+@build.number@";     // If true, looks for views in the parent first, if not found, then in the module. Else vice-versa     this.viewParentLookup   = true;     // If true, looks for layouts in the parent first, if not found, then in module. Else vice-versa     this.layoutParentLookup = true;     // Module Entry Point     this.entryPoint         = "cbswagger";     // Model Namespace     this.modelNamespace     = "cbswagger";     // CF Mapping     this.cfmapping          = "cbswagger";     // Module Dependencies That Must Be Loaded First, use internal names or aliases     this.dependencies       = [ "swagger-sdk" ];
  34. 34. MODULECONFIG.CFC METHODS
  35. 35. MODULECONFIG.CFCCONFIGURE function configure(){         settings = {             caching = false,             mailTo = "lmajano@ortussolutions.com"         };         layoutSettings = { defaultLayout = "relax.cfm" };         i18n = {             resourceBundles = {                 "cbcore" = "#moduleMapping#/i18n/cbcore"             },             defaultLocale = "en_US",             localeStorage = "cookie"         };         interceptorSettings = {             // ContentBox Custom Events             customInterceptionPoints = arrayToList( [                 // Code Rendering                 "cb_onContentRendering", "cb_onContentStoreRendering"             ] )         }; router.route( “/“, “main.index” );     }
  36. 36. Bonus: ModuleConfig is also an interceptor box install cors
  37. 37. LEVERAGING WIREBOX • Automatically maps all your models to • {modelName}@{moduleName}
 • property name=“builder” inject=“builder@qb”;
  38. 38. MODULAR EXECUTION #runEvent( ‘module:users.dashboard' )#
  39. 39. DemoTime! modules v1 v2 vx modules_app API handlers models
  40. 40. QUESTIONS? Go Modularize! www.ortussolutions.com @ortussolutions

×