معماری نرم افزار (Onion Architecture) - بخش سوم

ساختار پروژه در معماری onionApplication Core (appli​cation + domain)Presen​tationInfras​tru​cureTests1. Core LayerDomainدر این لایه ما هیچ تعامل مستقیمی با لایه‌های بیرونی نداریم. domain business و domain logicدر این لایه مشاهده می شوند. ساختاری چون entities, value objects, events, exceptions, services, factories interfaces پیاده سازی می گردند.Applicationلایه application منطق internal domain را مدیریت می کند ، از رو این لایه امکان ارتباط بین لایه داخلی و لایه های بیرونی مانند لایه presentation، tests و infrastructure را فراهم می کند.2. Presentation Layerدر این لایه پیاده سازی نهایی داده دریافتی از لایه داخلی برای کاربر نهایی از طریق مدل های مختلف شامل وب، api ،console و غیره را امکان پذیر می باشد.3. Infras​tru​cure layerلایه زیرساخت اصطلاحا وظیفه نگهداری کدهای سطح پایین را بر عهده دارد، از این رو هر چیزی در این لایه باید به راحتی قابل جایگزینی باشد. کدهای پیاده سازی شده در این لایه هرگزنباید بر روی رفتار برنامه شما تأثیر بگذارد.4. Test layerلایه تست عملکرد application core و ارتباطات بین application core و outer layer‌ها را تست می کند.CQRS (Command Query Responsibility Segregation)در پیاده سازی این معماری از الگو CQRS استفاده خواهیم کرد . CQRS مخفف Command and Query Responsibility Segregation است، الگویی که عملیات خواندن و به روز رسانی را برای یک ذخیره داده جدا می کند. پیاده سازی CQRS در این معماری می تواند عملکرد، مقیاس پذیری و امنیت را به حداکثر برساند. همچنین انعطاف‌پذیری ایجاد شده توسط CQRS به سیستم اجازه می‌دهد در گذر زمان و با توسعه پروژه راحتر maintain شود (این نکته که در بخش اول به آن اشاره کردیم یکی از اساسی ترین اهداف ما برای داشتن یک معماری تمیز بود ) و از ایجاد تداخل در سطح دامنه توسط دستورات به‌روزرسانی جلوگیری می‌کند. بر همین اساس ما در لایه core فولدرهای مشابهی چون command، query و event ها را می بینیم.این فولدرها در دامنه برای ایجاد رویداد و در application پیاده سازی handler به ازای هر رویداد استفاده خواهد شد.بیایید کمی جزیی تر به ساختار این معماری بپردازیمApplication Core (application + domain)ApplicationEvent: رویداد های ایجاد شده در لایه دامنه در این مدیریت می گردند. مثلا ارسال ایمیل بعد از ثبت یک سفارش جدیدservices: سرویس‌ها وظیفه‌ی تعامل بین دامنه ای را با استفاده از ‌interfaceهای تعریف شده در لایه دامنه امکان پذیر می سازند. مثلا دریافت لیست سفارش های یک کاربر (در نظر داشته باشید که کاربر و سفارش دو دامنه جدا می باشند)Query: کویری ها وظیفه واکشی داده از دامنه های اصلی از طریق interface های پیاده سازی شده در لایه های بیرونی را برعهده دارد. مثلا دریافت لیست اخرین سفارش ها بر اساس بازه زمانیcommand : در این لایه command‌هایی برای تغییر وضعیت business domain تعریف خواهد شد.مثلا ساخت یه سفارش جدید ، اپدیت وضعیت یک سفارش و غیرهDomainModel: در این پوشه entity ها ، value objectها و aggregate‌ها قرار می گیرندRepository Interface:در این پوشه interface‌هایی برای دسترسی به Business models در لایه های بیرونی قرار می‌گیرند. مثلا اینترفیسی برای دامنه سفارشAssertions :اعتبارسنجی های مختلف برای value object در این پوشه پیاده سازی می گردندService domain:در این لایه ارتباطات داخلی پیچیده بین مدل های دامنه تعریف می گردند.Event:در این پوشه رویداد هایی تعریف خواهند شدکه قصد تغییر وضعیت آنها بعد از یک command خاص در لایه business model را داریمPresentation Controller DTO (Data Transfer Object)InfrastructureORMDependency injectionRepository implementationsFilesystemQueueCron-jobsLoggingTestsUnit TestsIntegrationFunctionalاین پست ادامه دارد ...منابع بخش دوم:clean architecture bookThinkToCodehttps://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs