این پروژه با هدف آشنایی با دامین مربوط به قفلهای هوشمند و کنترل دسترسی به آنها انجام شده است. در سورس کد آن نحوه استفاده از امکانات Resource-based Authorization و Logical CQRS در کنار طراحی یک Rich Domain را می توانید مشاهده کنید. همچنین روش برقراری ارتباط با این قفلها از طریق پروتکل MQTT با استفاده از Emqx در آن تعبیه شده است.
قسمت هشتم - تو این ویدیو به طور کامل مباحث CQRS,CQS, Mediator Pattern, MediatR رو بررسی کردیم و یه کدی که قبلا نوشته بودیم رو ریفکتور کردیم.
02:00 CQS Concept 03:52 CQRS
09:38 Materialized View Pattern
12:00 CQRS Implementation without MediatR
17:24 Mediator Pattern
19:45 CQRS Implementation with MediatR Package
در این قسمت معماری کلین رو پیاده سازی کردیم و الگوی CQRS رو هم در کنارش پیاده سازی کردیم.
06:00 Domain Layer
07:00 Application Layer
08:37 Infrastructure/Persistence Layer
11:00 Presentation Lauer
12:20 Inside of Domain Layer ( enums, value objects, exceptions, entities)
18:00 Inside of Application Layer (CQRS, MediatR, Command, and Query Handler)
26:00 Inside of Infrastructure ( Adapter, EF Core)
29:00 Query and Command Bus
37:00 Fluent Validation
41:00 Behaviour Pipeline
Mini Course #1 Clean Architecture + CQRS - YouTube
00:00:00 - Intro
00:01:10 - Why do we record this course?
00:04:39 - Layered architecture: Why I don't like it anymore?
00:27:27 - Clean architecture
00:38:16 - Course prerequisites (still can't pronounce it correctly)
00:42:30 - What do we build?
00:45:18 - *Domain Layer*
00:49:57 - Entity
01:00:20 - Primitive obsession code smell
01:03:20 - Value Object
01:10:54 - Custom exceptions
01:33:25 - Domain model validation
01:38:55 - Aggregate
01:50:50 - Domain event
02:14:30 - Factory
02:28:50 - Policy
02:43:50 - Repository
02:48:55 - Domain Layer: Summary
02:56:45 - CQS: Command Query Separation
03:07:46 - CQRS: Command Query Responsibility Segregation
03:29:48 - *Application Layer*
03:30:25 - Command/Command Handler/Command Dispatcher definitions
03:40:45 - Automatic command handlers registration
03:44:12 - Application & Domain registration
03:50:52 - Command
03:55:31 - Command Handler
04:01:11 - Where to put methods related to reading?
04:07:00 - Read Service
04:14:14 - Weather Service
04:28:25 - Overview of the other commands & command handlers
04:34:35 - Query/Query Handler/Query Dispatcher definitions
04:44:37 - Automatic query handlers registration (BONUS: example of copy/paste pattern)
04:52:50 - How to tackle reading on Query side?
05:06:30 - *Infrastructure Layer*
05:07:56 - Configuration of Entity Framework Core
05:15:15 - Read Models
05:19:05 - ReadDbContext & WriteDbContext
05:24:13 - EF Entity Configuration
05:42:37 - DbContexts registration
05:55:51 - Query Handlers
06:12:18 - Repository implementation on top of EF Core
06:16:45 - Read Service implementation on top of EF Core
06:19:00 - Dummy Weather Service implementation
06:23:20 - EF Migration
06:29:50 - Applying EF migrations automatically
06:39:38 - *Presentation Layer*
06:41:35 - Controller
06:50:43 - How to return ID of resource in CQRS approach?
07:00:02 - Testing API
07:09:29 - *Cross Cutting Concerns*
07:09:30 - Error Handling
07:20:49 - Logging
07:34:57 - *Unit Testing*
07:42:34 - Unit Test on Domain Layer
08:09:45 - Unit Test on Application Layer
08:34:00 - Summary
اگر بدنبال استفاده کردن از تکنولوژی های Ef core و Dapper با الگو CQRS در پروژه های ASP.NET Core هستید این مقاله به شما کمک خواهد کرد.
FastEndpoints offers a more elegant solution than the Minimal APIs and MVC Controllers with the goal of increasing developer productivity. Performance is on par with the Minimal APIs and is faster; uses less memory; and outperforms a MVC Controller by about 34k requests per second on a Ryzen 3700X desktop.
اگر به مبحث CQRS علاقمند هستید و میخواهید بطور کامل و درست اونو تو پروژههای خودتون پیاده سازی کنید و از پرفرمنس اپلیکیشن خود راضی باشید، ریپازیتوری ای را که معرفی میکنم، دنبال کنید.
یکی از مزایای CQRS ، Scalability است. بدون Scale کردن ، کل اپلیکیشن ما درون یک سرور قرار دارد و تنها به منابع یک سرور محدود میشود. با گذشت زمان و رشد اپلیکیشن منابع بیشتری مورد نیاز خواهد بود و باید این سرور را قویتر کنیم که این ماجرا هزینه بر است.
چونکه عملیات خواندن بیشتر از نوشتن، آپدیت و حذف اطلاعات درخواست میشود درنتیجه بار بیشتری روی کوریهای اپلیکیشن هست ، پس جداسازی دیتابیسهای Query و Command میتواند تاثیر چشمگیری در سرعت و کارایی اپلیکیشن شما داشته باشد.
بدین ترتیب میتوانیم برای عملیات Read ، سرور را قویتر و برای باقی عملیات از سرورهای ضعیفتر استفاده کنیم و این چیزی است که توسط Scalability فراهم میشود.
در این پروژه کانتکستها و ریپازیتوریهای خواندن و نوشتن جدا شده است و به این ترتیب میتونید در Query ها از کانتکست یا ریپازیتوری خواندن و در Command ها از کانتکست یا ریپازیتوری نوشتن استفاده کنید.
یک راه برای جداسازی دیتابیسهای خواندن و نوشتن استفاده از تکنیک Always On اسکول سرور است که بعد از پیاده سازی آن، شما میتوانید کانکشن استرینگهای دیتابیسهای خود را در فایل appsettings.json قرار داده و دیتابیس Command و Query اپلیکیشن خود را بدین ترتیب جدا سازی نمایید.
راه حل دیگر میتواند این باشد که در پیاده سازی ریپازیتوری خواندن خود از Dapper برای کوری گرفتن استفاده کنید که کارایی و سرعت آن در مواردی به مراتب بیشتر از ef است.
یک راه بهتر می تواند طراحی دیتابیسی باشد که جداول Denormal و Flat داشته باشد که تمام فیلدهای مورد نیاز درون آن قرارگیرد. سپس با هر بار درج اطلاعات در دیتابیس Command این جداول نیر آپدیت شوند. با داشتن این جداول دیگر نیاز به Join های عجیب و غریب SQL نداریم.
بسته به بیزینس مورد نظر و منابع موجود میتوانید از تکنیک ها، ابزارها و دیتابیسهای دیگری هم در پیاده سازیهای خود استفاده کنید.