package Ġcom . sorting hat . pattern _ detector . domain . services Ċ Ċ import Ġcom . sorting hat . pattern _ detector . domain . be haviors . Visit able Ċ import Ġcom . sorting hat . pattern _ detector . domain . model .* Ċ import Ġcom . sorting hat . pattern _ detector . domain . model . patterns . Async Message Ċ Ċ class ĠSc enarios Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġone Service One Operation (): ĠList < Visit able > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= ĠService ( name Ġ= Ġ" foo ", Ġsystem Name Ġ= Ġ ĠSl ug . from (" foo Ġservice ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation Ġ= ĠOperation ( verb Ġ= ĠHttp Verb . GET , Ġuri Ġ= Ġ"/ foo ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . expose ( operation ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġone Service One Database (): ĠList < Visit able > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= ĠService ( name Ġ= Ġ" foo ", Ġsystem Name Ġ= Ġ ĠSl ug . from (" foo Ġservice ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdatabase Ġ= ĠDatabase ( name Ġ= Ġ" foo Ġdb ", ĠDataSource . Mongo Db ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase Usage ( service , Ġdatabase , ĠDatabase Access Mode . ReadWrite ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġone Service With Two Databases (): ĠList < Visit able > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Ġ= ĠService ( name Ġ= Ġ" foo ", Ġsystem Name Ġ= ĠSl ug . from (" foo Ġsystem ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb 1 Ġ= ĠDatabase ( name Ġ= Ġ" db Ġ 1 ", ĠDataSource . Mongo Db ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb 2 Ġ= ĠDatabase ( name Ġ= Ġ" db Ġ 2 ", ĠDataSource . Post gre Sql ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase Usage ( service , Ġdatabase Ġ= Ġdb 1 , Ġaccess Mode Ġ= ĠDatabase Access Mode . ReadWrite ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase Usage ( service , Ġdatabase Ġ= Ġdb 2 , Ġaccess Mode Ġ= ĠDatabase Access Mode . ReadWrite ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( service ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġone Module With One Service (): ĠList < Visit able > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexplicit Module Ġ= ĠModule () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Service ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" foo ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsystem Name Ġ= ĠSl ug . from (" foo Ġsystem "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Ġ= Ġexplicit Module ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġone Module With Very Large Service (): ĠList < Visit able > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexplicit Module Ġ= ĠModule () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsvc Ġ= ĠService ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" foo ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsystem Name Ġ= ĠSl ug . from (" foo Ġsystem "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Ġ= Ġexplicit Module ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsvc . expose ( Operation ( Http Verb . GET , Ġ"/ oper _$ i ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( svc ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġone Query Service With Two Sync Dependencies (): ĠList < Visit able > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Name Ġ= ĠSl ug . from (" foo Ġsystem ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Svc Ġ= ĠService ( name Ġ= Ġ" query ", Ġsystem Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdep 1 Ġ= ĠService ( name Ġ= Ġ" dep Ġ 1 ", Ġsystem Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdep 2 Ġ= ĠService ( name Ġ= Ġ" dep Ġ 2 ", Ġsystem Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Op Ġ= ĠOperation ( Http Verb . GET , Ġ"/ foo ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpartial Query 1 Ġ= ĠOperation ( Http Verb . GET , Ġ"/ bar ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpartial Query 2 Ġ= ĠOperation ( Http Verb . GET , Ġ"/ baz ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Svc . expose ( query Op ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdep 1 . expose ( partial Query 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdep 2 . expose ( partial Query 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( partial Query 1 , Ġpartial Query 2 ). forEach Ġ{ Ġpartial Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery Svc . consume ( partial ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( query Svc , Ġdep 1 , Ġdep 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġone Publisher One Subscriber (): ĠList < Visit able > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Name Ġ= ĠSl ug . from (" foo Ġsystem ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpublisher Ġ= ĠService ( name Ġ= Ġ" pub ", Ġsystem Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubscriber Ġ= ĠService ( name Ġ= Ġ" sub ", Ġsystem Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠMessage Channel (" topic ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublisher . publish To ( channel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriber . listen To ( channel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( publisher , Ġsubscriber ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġone Publisher Two Sub scribers (): ĠList < Visit able > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Name Ġ= ĠSl ug . from (" foo Ġsystem ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpublisher Ġ= ĠService ( name Ġ= Ġ" pub ", Ġsystem Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubscriber 1 Ġ= ĠService ( name Ġ= Ġ" sub 1 ", Ġsystem Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubscriber 2 Ġ= ĠService ( name Ġ= Ġ" sub 2 ", Ġsystem Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠMessage Channel (" topic ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublisher . publish To ( channel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriber 1 . listen To ( channel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriber 2 . listen To ( channel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( publisher , Ġsubscriber 1 , Ġsubscriber 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcq rs Between Two Services (): ĠC QR SS c enario Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġslug Ġ= ĠSl ug . from (" foo Ġsystem ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= ĠService ( name Ġ= Ġ" command ", Ġslug ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĠService ( name Ġ= Ġ" query ", Ġslug ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . expose ( Operation ( Http Verb . POST , Ġ"/ fo os ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery . expose ( Operation ( Http Verb . GET , Ġ"/ fo os ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠMessage Channel ( name Ġ= Ġ" topic ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . publish To ( channel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery . listen To ( channel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠC QR SS c enario ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( command , Ġquery ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( Async Message . from ( command , Ġquery )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġtwo Cq rs Each Non T rivial (): ĠC QR SS c enario Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġslug Ġ= ĠSl ug . from (" foo Ġsystem ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand A 1 Ġ= ĠService ( name Ġ= Ġ" command A 1 ", Ġslug ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand A 2 Ġ= ĠService ( name Ġ= Ġ" command A 2 ", Ġslug ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery A Ġ= ĠService ( name Ġ= Ġ" query A ", Ġslug ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand A 1 . expose ( Operation ( Http Verb . POST , Ġ"/ fo os ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand A 2 . expose ( Operation ( Http Verb . POST , Ġ"/ baz es ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery A . expose ( Operation ( Http Verb . GET , Ġ"/ fo os /: id / baz es ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel A 1 Ġ= ĠMessage Channel ( name Ġ= Ġ" topic A 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel A 2 Ġ= ĠMessage Channel ( name Ġ= Ġ" topic A 2 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand A 1 . publish To ( channel A 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand A 2 . publish To ( channel A 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery A . listen To ( channel A 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery A . listen To ( channel A 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand B 1 Ġ= ĠService ( name Ġ= Ġ" command B 1 ", Ġslug ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand B 2 Ġ= ĠService ( name Ġ= Ġ" command B 2 ", Ġslug ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery B Ġ= ĠService ( name Ġ= Ġ" query B ", Ġslug ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand B 1 . expose ( Operation ( Http Verb . POST , Ġ"/ foo ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand B 2 . expose ( Operation ( Http Verb . POST , Ġ"/ baz ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery B . expose ( Operation ( Http Verb . GET , Ġ"/ foo /: id / baz ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel B 1 Ġ= ĠMessage Channel ( name Ġ= Ġ" topic B 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel B 2 Ġ= ĠMessage Channel ( name Ġ= Ġ" topic B 2 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand A 1 . publish To ( channel B 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand A 2 . publish To ( channel B 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery A . listen To ( channel B 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery A . listen To ( channel B 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠC QR SS c enario ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( command A 1 , Ġcommand A 2 , Ġquery A , Ġcommand B 1 , Ġcommand B 2 , Ġquery B ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAsync Message . from ( command A 1 , Ġquery A ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAsync Message . from ( command A 2 , Ġquery A ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAsync Message . from ( command B 1 , Ġquery B ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAsync Message . from ( command B 2 , Ġquery B ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġone Module With Two Services (): ĠList < Visit able > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsystem Ġ= ĠSl ug . from (" foo ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Ġ= ĠModule () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsvc 1 Ġ= ĠService ( name Ġ= Ġ" svc 1 ", Ġsystem , Ġmodule Ġ= Ġmodule ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsvc 2 Ġ= ĠService ( name Ġ= Ġ" svc 2 ", Ġsystem , Ġmodule Ġ= Ġmodule ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( svc 1 , Ġsvc 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }