mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-10-14 17:54:42 +00:00
1 line
50 KiB
XML
1 line
50 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="DESCRIPTION" height="893px" preserveAspectRatio="none" style="width:2717px;height:893px;background:#FFFFFF;" version="1.1" viewBox="0 0 2717 893" width="2717px" zoomAndPan="magnify"><?plantuml 1.2026.6?><defs/><g><g class="title" data-source-line="6"><text fill="#000000" font-family="Arial" font-size="22" font-weight="700" lengthAdjust="spacing" textLength="496.3643" x="1109.5679" y="35.6357">The Biergarten App - Vertical Slice Architecture</text></g><!--cluster API.Core (thin host)--><g class="cluster" data-qualified-name="API.Core .thin host." data-source-line="8" id="ent0001"><rect fill="#E3F2FD" height="150.69" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="514" x="1329.5" y="58.2979"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="131.4346" x="1520.7827" y="73.4297">API.Core (thin host)</text></g><!--cluster Feature Slices--><g class="cluster" data-qualified-name="Feature Slices" data-source-line="20" id="ent0006"><rect fill="#F3E5F5" height="225.43" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="1495" x="1036.5" y="271.9879"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="94.9375" x="1736.5313" y="287.1197">Feature Slices</text></g><!--cluster Shared--><g class="cluster" data-qualified-name="Shared" data-source-line="52" id="ent0020"><rect fill="#FCE4EC" height="135.75" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="682" x="263.5" y="560.4179"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="47.4619" x="580.769" y="575.5497">Shared</text></g><!--cluster Infrastructure Layer--><g class="cluster" data-qualified-name="Infrastructure Layer" data-source-line="64" id="ent0026"><rect fill="#FFF3E0" height="97.1" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="1097" x="969.5" y="579.7479"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="132.2686" x="1451.8657" y="594.8797">Infrastructure Layer</text></g><!--cluster Domain Layer--><g class="cluster" data-qualified-name="Domain Layer" data-source-line="72" id="ent0032"><rect fill="#E8F5E9" height="150.69" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="696" x="2007.5" y="729.1679"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="92.5859" x="2309.207" y="744.2997">Domain Layer</text></g><!--cluster SQL Server--><g class="cluster" data-qualified-name="SQL Server" data-source-line="85" id="ent0038"><path d="M2140.5,574.7479 C2140.5,564.7479 2197.5,564.7479 2197.5,564.7479 C2197.5,564.7479 2254.5,564.7479 2254.5,574.7479 L2254.5,666.8479 C2254.5,676.8479 2197.5,676.8479 2197.5,676.8479 C2197.5,676.8479 2140.5,676.8479 2140.5,666.8479 L2140.5,574.7479" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2140.5,574.7479 C2140.5,584.7479 2197.5,584.7479 2197.5,584.7479 C2197.5,584.7479 2254.5,584.7479 2254.5,574.7479" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="700" lengthAdjust="spacing" textLength="76.2617" x="2159.3691" y="599.8797">SQL Server</text></g><!--entity API--><g class="entity" data-qualified-name="API.Core .thin host..API" data-source-line="9" id="ent0002"><rect fill="#FFFFFF" height="62.1973" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="223.6201" x="1345.69" y="112.0379"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1549.3101" y="117.0379"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1547.3101" y="119.0379"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1547.3101" y="123.0379"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="56.7998" x="1360.69" y="145.1697">API.Core</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="183.6201" x="1360.69" y="161.2683">ASP.NET Core Web API host</text></g><g class="entity" data-qualified-name="API.Core .thin host..GMN3" data-source-line="11" id="ent0004"><path d="M1603.83,93.2979 L1603.83,139.1379 L1569.62,143.1379 L1603.83,147.1379 L1603.83,192.9902 A0,0 0 0 0 1603.83,192.9902 L1827.1615,192.9902 A0,0 0 0 0 1827.1615,192.9902 L1827.1615,103.2979 L1817.1615,93.2979 L1603.83,93.2979 A0,0 0 0 0 1603.83,93.2979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1817.1615,93.2979 L1817.1615,103.2979 L1827.1615,103.2979 L1817.1615,93.2979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="139.4263" x="1609.83" y="110.4917">- Program.cs wiring only</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="181.7334" x="1609.83" y="125.4404">- MediatR + AddApplicationPart</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="140.8926" x="1617.0536" y="140.3892">per Features.* assembly</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="202.3315" x="1609.83" y="155.3379">- Swagger/OpenAPI, health checks</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="133.6499" x="1609.83" y="170.2866">- JWT auth middleware</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="132.9517" x="1609.83" y="185.2354">- Global exception filter</text></g><!--entity UsersSlice--><g class="entity" data-qualified-name="Feature Slices.UsersSlice" data-source-line="21" id="ent0007"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="135.6963" x="1448.65" y="371.1579"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1564.3463" y="376.1579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1562.3463" y="378.1579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1562.3463" y="382.1579"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="95.6963" x="1463.65" y="404.2897">Features.Users</text></g><!--entity BrewerySlice--><g class="entity" data-qualified-name="Feature Slices.BrewerySlice" data-source-line="22" id="ent0008"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="161.3789" x="1869.81" y="371.1579"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="2011.1889" y="376.1579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2009.1889" y="378.1579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2009.1889" y="382.1579"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="121.3789" x="1884.81" y="404.2897">Features.Breweries</text></g><!--entity EmailsSlice--><g class="entity" data-qualified-name="Feature Slices.EmailsSlice" data-source-line="23" id="ent0009"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="141.1445" x="1052.93" y="371.1579"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1174.0745" y="376.1579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1172.0745" y="378.1579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1172.0745" y="382.1579"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="101.1445" x="1067.93" y="404.2897">Features.Emails</text></g><!--entity LocationsSlice--><g class="entity" data-qualified-name="Feature Slices.LocationsSlice" data-source-line="24" id="ent0010"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="159.0684" x="2065.97" y="371.1579"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="2205.0384" y="376.1579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2203.0384" y="378.1579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2203.0384" y="382.1579"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="119.0684" x="2080.97" y="404.2897">Features.Locations</text></g><g class="entity" data-qualified-name="Feature Slices.GMN11" data-source-line="26" id="ent0012"><path d="M1619.83,306.9879 L1619.83,390.2079 L1584.5,394.2079 L1619.83,398.2079 L1619.83,481.4239 A0,0 0 0 0 1619.83,481.4239 L1835.1762,481.4239 A0,0 0 0 0 1835.1762,481.4239 L1835.1762,316.9879 L1825.1762,306.9879 L1619.83,306.9879 A0,0 0 0 0 1619.83,306.9879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1825.1762,306.9879 L1825.1762,316.9879 L1835.1762,316.9879 L1825.1762,306.9879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="140.8926" x="1625.83" y="324.1817">Each slice owns its own:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="170.498" x="1625.83" y="339.1304">- Controller (HTTP endpoints)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="190.3789" x="1625.83" y="354.0792">- Commands/Queries + Handlers</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="65.749" x="1625.83" y="369.0279">- Validators</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="124.9854" x="1625.83" y="383.9766">- Repository (Dapper)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1625.83" y="398.9254"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="159.6753" x="1625.83" y="413.8741">Features.Users covers auth</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="164.7407" x="1625.83" y="428.8228">(Commands/Authentication),</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="125.0234" x="1625.83" y="443.7715">account management</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="154.6226" x="1625.83" y="458.7203">(Commands/Account), and</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="194.3462" x="1625.83" y="473.669">profile/avatar (Commands/Profile)</text></g><g class="entity" data-qualified-name="Feature Slices.GMN14" data-source-line="39" id="ent0015"><path d="M1228.99,366.7779 L1228.99,390.2079 L1194.27,394.2079 L1228.99,398.2079 L1228.99,421.624 A0,0 0 0 0 1228.99,421.624 L1414.0007,421.624 A0,0 0 0 0 1414.0007,421.624 L1414.0007,376.7779 L1404.0007,366.7779 L1228.99,366.7779 A0,0 0 0 0 1228.99,366.7779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1404.0007,366.7779 L1404.0007,376.7779 L1414.0007,376.7779 L1404.0007,366.7779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="157.5171" x="1234.99" y="383.9717">No controller - invoked only</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="164.0107" x="1234.99" y="398.9204">via MediatR commands sent</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="95.3608" x="1234.99" y="413.8692">from other slices</text></g><g class="entity" data-qualified-name="Feature Slices.GMN17" data-source-line="44" id="ent0018"><path d="M2259.91,351.8279 L2259.91,390.2079 L2225.38,394.2079 L2259.91,398.2079 L2259.91,436.5715 A0,0 0 0 0 2259.91,436.5715 L2515.0814,436.5715 A0,0 0 0 0 2515.0814,436.5715 L2515.0814,361.8279 L2505.0814,351.8279 L2259.91,351.8279 A0,0 0 0 0 2259.91,351.8279" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2505.0814,351.8279 L2505.0814,361.8279 L2515.0814,361.8279 L2505.0814,351.8279" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="169.0889" x="2265.91" y="369.0217">No controller and no MediatR</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="228.3506" x="2265.91" y="383.9704">handlers - exposes ILocationRepository</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="165.4517" x="2265.91" y="398.9192">directly as a plain DI service.</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="190.0298" x="2265.91" y="413.8679">Not registered by API.Core at all;</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="234.1714" x="2265.91" y="428.8166">only Database.Seed depends on it today</text></g><!--entity SharedContracts--><g class="entity" data-qualified-name="Shared.SharedContracts" data-source-line="53" id="ent0021"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="148.9443" x="781.03" y="614.7479"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="909.9743" y="619.7479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="907.9743" y="621.7479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="907.9743" y="625.7479"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="108.9443" x="796.03" y="647.8797">Shared.Contracts</text></g><!--entity SharedApp--><g class="entity" data-qualified-name="Shared.SharedApp" data-source-line="54" id="ent0022"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="157.5234" x="279.74" y="614.7479"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="417.2634" y="619.7479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="415.2634" y="621.7479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="415.2634" y="625.7479"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="117.5234" x="294.74" y="647.8797">Shared.Application</text></g><g class="entity" data-qualified-name="Shared.GMN23" data-source-line="56" id="ent0024"><path d="M472.55,595.4179 L472.55,633.7979 L437.43,637.7979 L472.55,641.7979 L472.55,680.1615 A0,0 0 0 0 472.55,680.1615 L746.4406,680.1615 A0,0 0 0 0 746.4406,680.1615 L746.4406,605.4179 L736.4406,595.4179 L472.55,595.4179 A0,0 0 0 0 472.55,595.4179" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M736.4406,595.4179 L736.4406,605.4179 L746.4406,605.4179 L736.4406,595.4179" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="116.3462" x="478.55" y="612.6117">- ValidationBehavior</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="105.4917" x="485.7736" y="627.5604">(MediatR pipeline)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="174.0908" x="478.55" y="642.5092">- Cross-slice email commands</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="200.1416" x="485.7736" y="657.4579">(SendRegistrationEmailCommand,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="245.667" x="485.7736" y="672.4066">SendResendConfirmationEmailCommand)</text></g><!--entity Sql--><g class="entity" data-qualified-name="Infrastructure Layer.Sql" data-source-line="65" id="ent0027"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="146.5996" x="1904.2" y="614.7479"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="2030.7996" y="619.7479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2028.7996" y="621.7479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2028.7996" y="625.7479"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="106.5996" x="1919.2" y="647.8797">Infrastructure.Sql</text></g><!--entity JWT--><g class="entity" data-qualified-name="Infrastructure Layer.JWT" data-source-line="66" id="ent0028"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="147.3652" x="1447.82" y="614.7479"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1575.1852" y="619.7479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1573.1852" y="621.7479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1573.1852" y="625.7479"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="107.3652" x="1462.82" y="647.8797">Infrastructure.Jwt</text></g><!--entity PwdHash--><g class="entity" data-qualified-name="Infrastructure Layer.PwdHash" data-source-line="67" id="ent0029"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="239.1992" x="1629.9" y="614.7479"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1849.0992" y="619.7479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1847.0992" y="621.7479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1847.0992" y="625.7479"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="199.1992" x="1644.9" y="647.8797">Infrastructure.PasswordHashing</text></g><!--entity Email--><g class="entity" data-qualified-name="Infrastructure Layer.Email" data-source-line="68" id="ent0030"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="161.3721" x="985.81" y="614.7479"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1127.1821" y="619.7479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1125.1821" y="621.7479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1125.1821" y="625.7479"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="121.3721" x="1000.81" y="647.8797">Infrastructure.Email</text></g><!--entity EmailTemplates--><g class="entity" data-qualified-name="Infrastructure Layer.EmailTemplates" data-source-line="69" id="ent0031"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="230.6201" x="1182.19" y="614.7479"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1392.8101" y="619.7479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1390.8101" y="621.7479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1390.8101" y="625.7479"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="190.6201" x="1197.19" y="647.8797">Infrastructure.Email.Templates</text></g><!--entity Domain--><g class="entity" data-qualified-name="Domain Layer.Domain" data-source-line="73" id="ent0033"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="138.041" x="2218.48" y="790.9579"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="2336.521" y="795.9579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2334.521" y="797.9579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2334.521" y="801.9579"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="98.041" x="2233.48" y="824.0897">Domain.Entities</text></g><!--entity DomainExceptions--><g class="entity" data-qualified-name="Domain Layer.DomainExceptions" data-source-line="74" id="ent0034"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="160.6133" x="2023.19" y="790.9579"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="2163.8033" y="795.9579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2161.8033" y="797.9579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2161.8033" y="801.9579"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="120.6133" x="2038.19" y="824.0897">Domain.Exceptions</text></g><g class="entity" data-qualified-name="Domain Layer.GMN35" data-source-line="76" id="ent0036"><path d="M2391.37,764.1679 L2391.37,810.0079 L2356.9,814.0079 L2391.37,818.0079 L2391.37,863.8602 A0,0 0 0 0 2391.37,863.8602 L2687.6361,863.8602 A0,0 0 0 0 2687.6361,863.8602 L2687.6361,774.1679 L2677.6361,764.1679 L2391.37,764.1679 A0,0 0 0 0 2391.37,764.1679" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2677.6361,764.1679 L2677.6361,774.1679 L2687.6361,774.1679 L2677.6361,764.1679" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="275.2661" x="2397.37" y="781.3617">- UserAccount, UserCredential, UserVerification</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="144.479" x="2397.37" y="796.3104">- UserProfile, UserAvatar</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="211.6943" x="2397.37" y="811.2592">- BreweryPost, BreweryPostLocation</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="171.228" x="2397.37" y="826.2079">- City, StateProvince, Country</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="124.998" x="2397.37" y="841.1566">- BeerPost, BeerStyle</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="226.1479" x="2404.5936" y="856.1054">(schema tables exist; no repository yet)</text></g><!--entity Tables--><g class="entity" data-qualified-name="SQL Server.Tables" data-source-line="86" id="ent0039"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="82.0205" x="2156.49" y="614.7479"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="2218.5105" y="619.7479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2216.5105" y="621.7479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2216.5105" y="625.7479"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="42.0205" x="2171.49" y="647.8797">Tables</text></g><!--entity Seed--><g class="entity" data-qualified-name="Seed" data-source-line="89" id="ent0040"><polygon fill="#FFFFFF" points="1861.9,122.0379,1871.9,112.0379,2045.0992,112.0379,2045.0992,164.2351,2035.0992,174.2351,1861.9,174.2351,1861.9,122.0379" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line style="stroke:#000000;stroke-width:1;" x1="2035.0992" x2="2045.0992" y1="122.0379" y2="112.0379"/><line style="stroke:#000000;stroke-width:1;" x1="1861.9" x2="2035.0992" y1="122.0379" y2="122.0379"/><line style="stroke:#000000;stroke-width:1;" x1="2035.0992" x2="2035.0992" y1="122.0379" y2="174.2351"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="96.5166" x="1876.9" y="145.1697">Database.Seed</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="59.1445" x="1876.9" y="161.2683">(separate</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="3.8896" x="1936.0445" y="161.2683"> </text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="48.2549" x="1939.9342" y="161.2683">console</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="3.8896" x="1988.1891" y="161.2683"> </text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="28.0205" x="1992.0787" y="161.2683">app)</text></g><g class="entity" data-qualified-name="GMN69" data-source-line="133" id="ent0070"><path d="M2273.58,602.8979 L2273.58,672.6928 L2491.4208,672.6928 L2491.4208,612.8979 L2481.4208,602.8979 L2273.58,602.8979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2481.4208,602.8979 L2481.4208,612.8979 L2491.4208,612.8979 L2481.4208,602.8979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="109.1035" x="2279.58" y="620.0917">SQL-first approach</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="196.8408" x="2279.58" y="635.0404">Each slice's own repository issues</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="190.0234" x="2279.58" y="649.9892">inline SQL via Dapper - no ORM,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="122.8525" x="2279.58" y="664.9379">no stored procedures</text></g><g class="entity" data-qualified-name="GMN72" data-source-line="140" id="ent0073"><path d="M76.3,610.3679 L76.3,665.214 L244.6926,665.214 L244.6926,620.3679 L234.6926,610.3679 L76.3,610.3679" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M234.6926,610.3679 L234.6926,620.3679 L244.6926,620.3679 L234.6926,610.3679" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="122.8335" x="82.3" y="627.5617">No Features.* project</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="138.0234" x="82.3" y="642.5104">ever references another</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="147.3926" x="82.3" y="657.4592">Features.* project directly</text></g><!--link API to UsersSlice--><g class="link" data-entity-1="ent0002" data-entity-2="ent0007" data-link-type="dependency" data-source-line="92" id="lnk41"><path d="M1457.04,174.4679 C1456.83,189.6379 1456.6,208.2779 1456.5,224.9879 C1456.41,238.7679 1453.68,242.4979 1456.5,255.9879 C1465.44,298.7379 1486.0468,340.1154 1500.8268,366.5054" fill="none" id="API-to-UsersSlice" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="1503.27,370.8679,1502.3621,361.0609,1500.8268,366.5054,1495.3823,364.9701,1503.27,370.8679" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="110.5698" x="1457.5" y="238.1817">AddApplicationPart</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="90.6826" x="1467.4436" y="253.1304">+ MediatR scan</text></g><!--link API to BrewerySlice--><g class="link" data-entity-1="ent0002" data-entity-2="ent0008" data-link-type="dependency" data-source-line="93" id="lnk42"><path d="M1503.92,174.5679 C1525.32,189.1479 1550.74,207.2679 1572.5,224.9879 C1588.1,237.6979 1586.91,248.2779 1605.5,255.9879 C1630.86,266.5079 1828.11,251.3779 1852.5,263.9879 C1896.89,286.9379 1924.7303,335.6547 1938.9203,366.1447" fill="none" id="API-to-BrewerySlice" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="1941.03,370.6779,1940.859,360.8305,1938.9203,366.1447,1933.606,364.206,1941.03,370.6779" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="110.5698" x="1606.5" y="238.1817">AddApplicationPart</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="90.6826" x="1616.4436" y="253.1304">+ MediatR scan</text></g><!--link API to EmailsSlice--><g class="link" data-entity-1="ent0002" data-entity-2="ent0009" data-link-type="dependency" data-source-line="94" id="lnk43"><path d="M1367.82,174.6979 C1318.03,194.7079 1257.13,224.5179 1211.5,263.9879 C1175.99,294.7079 1150.5434,338.4595 1136.3134,366.4895" fill="none" id="API-to-EmailsSlice" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="1134.05,370.9479,1141.6908,364.7335,1136.3134,366.4895,1134.5574,361.1121,1134.05,370.9479" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="106.939" x="1260.53" y="238.1817">MediatR scan only</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="80.1963" x="1273.9013" y="253.1304">(no controller)</text></g><!--link Seed to UsersSlice--><g class="link" data-entity-1="ent0040" data-entity-2="ent0007" data-link-type="dependency" data-source-line="96" id="lnk44"><path d="M1916.01,174.7079 C1895.7,189.7279 1869.5,206.7479 1843.5,216.9879 C1823.38,224.9079 1816.22,218.7779 1795.5,224.9879 C1762.91,234.7479 1758.54,247.8679 1725.5,255.9879 C1698.9,262.5179 1626.21,250.2779 1602.5,263.9879 C1561.21,287.8579 1537.7031,335.8343 1526.0231,366.0443" fill="none" id="Seed-to-UsersSlice" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="1524.22,370.7079,1531.1964,363.7559,1526.0231,366.0443,1523.7347,360.871,1524.22,370.7079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="117.0381" x="1811.6741" y="238.1817">AddFeaturesUsers()</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="147.3862" x="1796.5" y="253.1304">(DI only, no API/MediatR)</text></g><!--link Seed to BrewerySlice--><g class="link" data-entity-1="ent0040" data-entity-2="ent0008" data-link-type="dependency" data-source-line="97" id="lnk45"><path d="M1953.13,174.6779 C1952.52,225.4679 1951.3703,321.1282 1950.8303,365.8682" fill="none" id="Seed-to-BrewerySlice" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="1950.77,370.8679,1954.8783,361.9168,1950.8303,365.8682,1946.8789,361.8202,1950.77,370.8679" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="140.8862" x="1953.44" y="245.6817">AddFeaturesBreweries()</text></g><!--link Seed to LocationsSlice--><g class="link" data-entity-1="ent0040" data-entity-2="ent0010" data-link-type="dependency" data-source-line="98" id="lnk46"><path d="M2037.72,174.6679 C2061.67,186.9979 2085.77,203.5079 2102.5,224.9879 C2136.5,268.6179 2143.6429,331.1321 2145.0829,365.8721" fill="none" id="Seed-to-LocationsSlice" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="2145.29,370.8679,2148.9138,361.7099,2145.0829,365.8721,2140.9207,362.0412,2145.29,370.8679" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="138.7407" x="2120.53" y="245.6817">AddFeaturesLocations()</text></g><!--link UsersSlice to Sql--><g class="link" data-entity-1="ent0007" data-entity-2="ent0027" data-link-type="dependency" data-source-line="100" id="lnk47"><path d="M1527.3,417.5279 C1540.99,443.2479 1567.15,484.6179 1602.5,505.4179 C1622.27,517.0579 1631.49,506.9479 1653.5,513.4179 C1686.14,523.0279 1690.39,536.5679 1723.5,544.4179 C1758.79,552.7979 1853.07,538.3579 1886.5,552.4179 C1917.68,565.5379 1941.7027,590.4046 1958.0527,610.6946" fill="none" id="UsersSlice-to-Sql" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1961.19,614.5879,1958.6575,605.0701,1958.0527,610.6946,1952.4283,610.0898,1961.19,614.5879" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link UsersSlice to JWT--><g class="link" data-entity-1="ent0007" data-entity-2="ent0028" data-link-type="dependency" data-source-line="101" id="lnk48"><path d="M1516.96,417.4979 C1517.91,463.5179 1519.9867,563.5789 1520.9367,609.5489" fill="none" id="UsersSlice-to-JWT" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1521.04,614.5479,1524.8532,605.4671,1520.9367,609.5489,1516.8549,605.6324,1521.04,614.5479" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link UsersSlice to PwdHash--><g class="link" data-entity-1="ent0007" data-entity-2="ent0029" data-link-type="dependency" data-source-line="102" id="lnk49"><path d="M1532.21,417.6879 C1548.67,440.6479 1575.81,476.8879 1602.5,505.4179 C1641.08,546.6679 1687.1238,586.1473 1717.7438,611.2573" fill="none" id="UsersSlice-to-PwdHash" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1721.61,614.4279,1717.1872,605.6279,1717.7438,611.2573,1712.1144,611.8139,1721.61,614.4279" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link UsersSlice to SharedContracts--><g class="link" data-entity-1="ent0007" data-entity-2="ent0021" data-link-type="dependency" data-source-line="103" id="lnk50"><path d="M1510.07,417.6879 C1498.89,452.1079 1472.23,516.8079 1423.5,544.4179 C1401.55,556.8579 993.39,544.3079 969.5,552.4179 C932.9,564.8479 901.9093,590.2972 880.6393,610.8072" fill="none" id="UsersSlice-to-SharedContracts" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="877.04,614.2779,886.2952,610.9101,880.6393,610.8072,880.7421,605.1513,877.04,614.2779" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link UsersSlice to SharedApp--><g class="link" data-entity-1="ent0007" data-entity-2="ent0022" data-link-type="dependency" data-source-line="104" id="lnk51"><path d="M1506.78,417.3679 C1493.86,443.7479 1468.29,486.6079 1431.5,505.4179 C1406.46,518.2279 1206.16,508.3379 1178.5,513.4179 C1136.89,521.0679 1130.18,537.1779 1088.5,544.4179 C1053.85,550.4479 488.36,539.8879 455.5,552.4179 C422.76,564.9079 396.9458,590.0131 379.3658,610.5031" fill="none" id="UsersSlice-to-SharedApp" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="376.11,614.2979,385.0062,610.072,379.3658,610.5031,378.9346,604.8627,376.11,614.2979" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link UsersSlice to SharedApp--><g class="link" data-entity-1="ent0007" data-entity-2="ent0022" data-link-type="dependency" data-source-line="117" id="lnk59"><path d="M1506.76,417.3279 C1493.82,443.6679 1468.23,486.4879 1431.5,505.4179 C1410.74,516.1179 1244.12,507.6279 1221.5,513.4179 C1191.66,521.0679 1189.44,537.1779 1159.5,544.4179 C1121.48,553.6279 492.06,538.5079 455.5,552.4179 C422.75,564.8879 396.9458,590.0031 379.3658,610.4931" fill="none" id="UsersSlice-to-SharedApp-1" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="376.11,614.2879,385.0062,610.062,379.3658,610.4931,378.9346,604.8527,376.11,614.2879" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="34.6899" x="1301.2554" y="526.6117">sends</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="192.2007" x="1222.5" y="541.5604">SendRegistrationEmailCommand</text></g><!--link BrewerySlice to Sql--><g class="link" data-entity-1="ent0008" data-entity-2="ent0027" data-link-type="dependency" data-source-line="106" id="lnk52"><path d="M1953.22,417.4179 C1956.1,441.1679 1960.75,479.9479 1964.5,513.4179 C1968.45,548.7379 1972.2009,584.8038 1974.7309,609.5238" fill="none" id="BrewerySlice-to-Sql" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1975.24,614.4979,1978.3029,605.1374,1974.7309,609.5238,1970.3445,605.9519,1975.24,614.4979" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link BrewerySlice to SharedContracts--><g class="link" data-entity-1="ent0008" data-entity-2="ent0021" data-link-type="dependency" data-source-line="107" id="lnk53"><path d="M1954.22,417.6579 C1958.33,451.1579 1960.14,513.5479 1923.5,544.4179 C1903.23,561.4979 994.63,544.0179 969.5,552.4179 C932.6,564.7579 901.4192,590.5269 880.1992,611.1069" fill="none" id="BrewerySlice-to-SharedContracts" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="876.61,614.5879,885.8554,611.1935,880.1992,611.1069,880.2858,605.4507,876.61,614.5879" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link BrewerySlice to SharedApp--><g class="link" data-entity-1="ent0008" data-entity-2="ent0022" data-link-type="dependency" data-source-line="108" id="lnk54"><path d="M1947.78,417.4979 C1942.28,451.6779 1926.36,516.0379 1882.5,544.4179 C1865.86,555.1879 474.04,545.4279 455.5,552.4179 C422.71,564.7879 396.9111,589.9191 379.3411,610.4491" fill="none" id="BrewerySlice-to-SharedApp" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="376.09,614.2479,384.9809,610.0109,379.3411,610.4491,378.9029,604.8092,376.09,614.2479" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link LocationsSlice to Sql--><g class="link" data-entity-1="ent0010" data-entity-2="ent0027" data-link-type="dependency" data-source-line="110" id="lnk55"><path d="M2148.31,417.6879 C2151,448.7679 2151.56,505.4279 2126.5,544.4179 C2105.85,576.5579 2074.1495,597.2391 2042.5995,612.1691" fill="none" id="LocationsSlice-to-Sql" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="2038.08,614.3079,2047.9261,614.0738,2042.5995,612.1691,2044.5041,606.8426,2038.08,614.3079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link EmailsSlice to Email--><g class="link" data-entity-1="ent0009" data-entity-2="ent0030" data-link-type="dependency" data-source-line="112" id="lnk56"><path d="M1070.97,417.7079 C1033.18,437.0379 985.06,468.8679 962.5,513.4179 C942.32,553.2879 983.404,588.7274 1020.454,611.7674" fill="none" id="EmailsSlice-to-Email" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1024.7,614.4079,1019.1696,606.2583,1020.454,611.7674,1014.9449,613.0519,1024.7,614.4079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link EmailsSlice to EmailTemplates--><g class="link" data-entity-1="ent0009" data-entity-2="ent0031" data-link-type="dependency" data-source-line="113" id="lnk57"><path d="M1127.68,417.5379 C1134.31,448.4379 1149.55,504.8779 1178.5,544.4179 C1199.74,573.4379 1228.2855,595.2476 1254.0555,611.6976" fill="none" id="EmailsSlice-to-EmailTemplates" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1258.27,614.3879,1252.8361,606.1737,1254.0555,611.6976,1248.5316,612.9169,1258.27,614.3879" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link EmailsSlice to SharedApp--><g class="link" data-entity-1="ent0009" data-entity-2="ent0022" data-link-type="dependency" data-source-line="114" id="lnk58"><path d="M1056.25,417.6779 C952.46,451.3379 746.42,514.1179 566.5,544.4179 C542.11,548.5279 478.34,542.9279 455.5,552.4179 C423.35,565.7879 397.6631,590.4342 379.9231,610.5942" fill="none" id="EmailsSlice-to-SharedApp" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="376.62,614.3479,385.5684,610.2337,379.9231,610.5942,379.5626,604.9489,376.62,614.3479" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link EmailsSlice to SharedApp--><g class="link" data-entity-1="ent0009" data-entity-2="ent0022" data-link-type="dependency" data-source-line="118" id="lnk60"><path d="M1052.59,395.3479 C881.85,397.3179 455.29,412.4679 364.5,513.4179 C339.84,540.8479 344.4664,582.2404 350.9064,609.6504" fill="none" id="EmailsSlice-to-SharedApp-1" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="352.05,614.5179,353.8855,604.8415,350.9064,609.6504,346.0975,606.6713,352.05,614.5179" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="45.5381" x="438.8313" y="526.6117">handles</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="192.2007" x="365.5" y="541.5604">SendRegistrationEmailCommand</text></g><!--link Sql to Domain--><g class="link" data-entity-1="ent0027" data-entity-2="ent0033" data-link-type="dependency" data-source-line="120" id="lnk61"><path d="M2029.44,661.3179 C2061.19,674.6579 2102.81,691.3979 2140.5,704.1679 C2167.16,713.1979 2177.43,706.5779 2201.5,721.1679 C2231.01,739.0579 2253.892,765.824 2269.352,786.784" fill="none" id="Sql-to-Domain" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="2272.32,790.8079,2270.1967,781.1906,2269.352,786.784,2263.7586,785.9393,2272.32,790.8079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link UsersSlice to Tables--><g class="link" data-entity-1="ent0007" data-entity-2="ent0039" data-link-type="dependency" data-source-line="122" id="lnk62"><path d="M1526.69,417.7379 C1539.96,444.0579 1565.87,486.4379 1602.5,505.4179 C1618.89,513.9179 1750.17,511.2079 1768.5,513.4179 C1839.98,522.0679 1855.99,536.0879 1927.5,544.4179 C1949.81,547.0279 2109.43,542.3279 2129.5,552.4179 C2155.72,565.6079 2172.7981,589.6891 2184.0481,609.8991" fill="none" id="UsersSlice-to-Tables" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="2186.48,614.2679,2185.5976,604.4586,2184.0481,609.8991,2178.6076,608.3496,2186.48,614.2679" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="72.2617" x="1928.5" y="534.1117">Dapper SQL</text></g><!--link BrewerySlice to Tables--><g class="link" data-entity-1="ent0008" data-entity-2="ent0039" data-link-type="dependency" data-source-line="123" id="lnk63"><path d="M1956.98,417.5279 C1968.12,451.4279 1994.36,515.0679 2041.5,544.4179 C2074.84,565.1779 2094.88,533.8879 2129.5,552.4179 C2155.37,566.2779 2172.4896,590.2308 2183.8496,610.2208" fill="none" id="BrewerySlice-to-Tables" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="2186.32,614.5679,2185.351,604.7668,2183.8496,610.2208,2178.3956,608.7194,2186.32,614.5679" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="72.2617" x="2042.5" y="534.1117">Dapper SQL</text></g><!--link LocationsSlice to Tables--><g class="link" data-entity-1="ent0010" data-entity-2="ent0039" data-link-type="dependency" data-source-line="124" id="lnk64"><path d="M2159.86,417.6479 C2173.65,440.6579 2193.53,477.9679 2201.5,513.4179 C2209.3,548.1279 2206.0593,584.7543 2202.2793,609.6943" fill="none" id="LocationsSlice-to-Tables" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="2201.53,614.6379,2206.8335,606.3389,2202.2793,609.6943,2198.9238,605.1401,2201.53,614.6379" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="72.2617" x="2206.53" y="534.1117">Dapper SQL</text></g><!--link UsersSlice to Domain--><g class="link" data-entity-1="ent0007" data-entity-2="ent0033" data-link-type="dependency" data-source-line="126" id="lnk65"><path d="M1506.81,417.4279 C1493.92,443.8879 1468.39,486.8079 1431.5,505.4179 C1412.3,515.1079 1065.98,512.5079 1044.5,513.4179 C831.8,522.5179 779.22,535.8579 566.5,544.4179 C552.4,544.9879 68.4,542.3679 58.5,552.4179 C11.19,600.4879 11,656.2879 58.5,704.1679 C79.46,725.2979 2174.24,709.2179 2201.5,721.1679 C2233.91,735.3679 2257.0029,764.1935 2271.6029,786.5135" fill="none" id="UsersSlice-to-Domain" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="2274.34,790.6979,2272.7608,780.9764,2271.6029,786.5135,2266.0658,785.3557,2274.34,790.6979" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link BrewerySlice to Domain--><g class="link" data-entity-1="ent0008" data-entity-2="ent0033" data-link-type="dependency" data-source-line="127" id="lnk66"><path d="M1963.16,417.3779 C1979.32,443.3579 2009.85,485.3979 2048.5,505.4179 C2076.69,520.0279 2088.77,505.4279 2119.5,513.4179 C2154.01,522.3979 2158.63,536.9479 2193.5,544.4179 C2210.62,548.0879 2496.28,539.8879 2508.5,552.4179 C2555.58,600.7079 2553.11,653.5879 2508.5,704.1679 C2488.5,726.8379 2400.43,707.4279 2373.5,721.1679 C2342.37,737.0479 2319.4014,764.8437 2304.4214,786.5337" fill="none" id="BrewerySlice-to-Domain" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="2301.58,790.6479,2309.9859,785.5155,2304.4214,786.5337,2303.4032,780.9692,2301.58,790.6479" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link LocationsSlice to Domain--><g class="link" data-entity-1="ent0010" data-entity-2="ent0033" data-link-type="dependency" data-source-line="128" id="lnk67"><path d="M2158.36,417.6379 C2174.47,443.4579 2204.61,484.9279 2242.5,505.4179 C2258.69,514.1779 2558.44,538.5079 2570.5,552.4179 C2617.3,606.3979 2619.98,661.6379 2570.5,713.1679 C2555.33,728.9679 2393.42,712.0479 2373.5,721.1679 C2341.52,735.8079 2318.5174,764.1936 2303.7974,786.3436" fill="none" id="LocationsSlice-to-Domain" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="2301.03,790.5079,2309.3428,785.2261,2303.7974,786.3436,2302.6799,780.7982,2301.03,790.5079" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link UsersSlice to DomainExceptions--><g class="link" data-entity-1="ent0007" data-entity-2="ent0034" data-link-type="dependency" data-source-line="129" id="lnk68"><path d="M1526.77,417.5879 C1540.11,443.7779 1566.09,486.0079 1602.5,505.4179 C1624.52,517.1579 1690.55,506.4179 1714.5,513.4179 C1742.18,521.5179 1743.65,536.9379 1771.5,544.4179 C1787.33,548.6779 2054.27,541.5079 2066.5,552.4179 C2135.04,613.5679 2119.7328,734.4334 2109.5728,785.6534" fill="none" id="UsersSlice-to-DomainExceptions" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="2108.6,790.5579,2114.2747,782.5081,2109.5728,785.6534,2106.4276,780.9516,2108.6,790.5579" style="stroke:#000000;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link GMN69 to Sql--><g class="link" data-entity-1="ent0070" data-entity-2="ent0027" data-link-type="association" data-source-line="133" id="lnk71"><path d="M2348.92,602.5479 C2321.6,576.5979 2280.56,543.4179 2237,528.9179 C2148.69,499.5379 2048.11,574.1779 2002.43,614.2879" fill="none" id="GMN69-Sql" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link UsersSlice to GMN72--><g class="link" data-entity-1="ent0007" data-entity-2="ent0073" data-link-type="association" data-source-line="140" id="lnk74"><path d="M1506.8,417.4179 C1493.91,443.8579 1468.37,486.7679 1431.5,505.4179 C1397.19,522.7879 1122.02,501.3779 1085.5,513.4179 C1062.78,520.9079 1064.27,537.0779 1041.5,544.4179 C1000.36,557.6879 304.13,537.6679 263.5,552.4179 C231.56,564.0179 202.34,590.1179 183.25,610.2379" fill="none" id="UsersSlice-GMN72" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><?plantuml-src bLTDanet4BtFh-ZO1qCCRChELYLsbQjO5k9rsMky4FkGpK7C24RPGHfB0aobyj_p9CqCOc2TYYzckfzQhVvutVk3pVcQKram8HFp86J9D5lJWgKFAwqsCXkfGcbwEl7_8aJ6bsnJs8cIzfR1mb0BLaJw4XROYi_ilk2aUMgPN1KyIQom4CnpJbU2wnNJbaiQbYNrwJFNLgIie5aXKcSnpON5oOt6kSeUFHbERmOZfJbrR2uavShOxXDwEduvUJ6vfhyJeZzgoBqSpgQ3s_6S_84lV45G-ID_4ZFk0t2fB3mKgzoIMbOoWZjJhLPuoI0rj1DQo1KfMUmhvGUU2MRlw3aDimpkmsDcXP9JFCX3Y4gkQSAPSzyCViHzXgyNZO7PZgrMN5zyBBd4dJtAEIjiJcdEqmTJWTvzcHFRGBeMMLRm7KCaWkQtGYqGAVujvQMxbvQYi5n3osNcdvJy4mMjyYD4rY1SavVZoybb25VZvE-6Q-CZutzvy17WIlCTru87KFZQdyB6QoQAW0a_Jo7lLOXNG3LVDV0u9qVU48rPcfFnDQ9sqf2mnlruLOLcX9BKgYWG_ixR-Npg8b8g8QtfDeZrcidCN7pQ-DSWYs_nZHDru3-pGcJCgaPmnqjb10Hxwbop4hdj9bvr73nArTRzvvBcrPtchY54NDggJhezhsPfYYQp10Zoj8Q-VIe0kZt2fzULMY7N_89jcMKwWaw3eXlNG3kIn-aWkbNmk0bNduJSgWUU7IfzArXJwsbr4vdQpwLMQr9ubmxvCD-x-oJ9xUkPFrbVvm5vbHQunhyX0yZLJMtda18FpOHZcMBlwea5GgFh6_YgjxXkKDrdmKKhOT0gUELYJmsRC4kiA5vxc7izNIEy2sRuOCO1pJZw54z7fmbBLcLi_rYlpNAqQUPwR3J-UJmAFHQ40r-RBBMXx8EmaKMuY54Y9AGdKOqrKUNYu1NFsLOeNT5HfqvZAKfU2CcRRj3Ac7xe9-xgeqbqVNA6Tzxvi6blsLTHLNUz2XGmg0ptdgNGwnDazx60tSYbPh2zyLHFxzcUwoT-vBmS_nJ2TmmPpBuM8InVYpFQTxj0xs3FCzefY7YdTFQM6SoFbKTET_xp3De_uC1aZo46Sxv6oLaUiLuZEdhijLgxogmVEVvbSZd-DJmog0PZa8IjEJR8OctD-B7-83ofZyQ0IxNZg8fHUlvZXDfnfCIAy8qHB9PLuKLdAce9cA4ddafRpO0fHcel_gYRjAunOVSzcbc40xQsGgOmDd9-w7eWNd7S4ypWbzyRwlep68fhHkZ70WJ0lw4GNpkcq0TItdFRhg-iQc1qvAVtg4-zTH7taPvxIpw0uQV3IvMv_CHjVoyxXhjz1X45KHc5rGNaZtt35Hy0IV8Cew48l9QBqYHkmHWCtaGpYrwTsH7kvVE6LqtAP7Ck7gh_xsJ4xJWOGpoXuIqofblCByzivvojXvgNTxeu2YPrHdekxBZmeZBVFTWuTRosqcmDdGX-F0sE3pGw74WYt_hzDxxbMoBNvorHtT3jmot2FQjsN9eSlQQ-zrJOilS8m5jiFRYscSHfSyB0CsUb1qPfgwDxdldbMabKR4JiM7-uyn4ElAAJaHxA0cgNN-l6frP_OPgYmvQObEZME5GkVSs5o9mZVNCllpSbZXnkdmz3_hyi98YMVsl5QEtaXKQ6kR2U4Ph-D1_dG6SISmxMlgzou-IAIdx6QgKvQoTYS6GGUmgIx8cyuCimv_seWoDz35TZ7GrfXKKuYVVXPtuHZdbH6BFnQvcGRkOx0twdgnxMT_tyyUv3pyyDCZY3_eJbb6Uk4vE6K8Ct2sMjM_bQEpdskEWldQfu71s3SWyrXBrC-cKneJFmPe4xtFal?></g></svg> |