استفاده از litebus برای پروژه از marvin جای mediateR استفاده کنیم از Mapperly به جای auto mapper پکیج brighter هم خیلی خوبه

خوب داره میگه که از Command برای CQRS استفاده میشه و با استفاده از DI این کار انجام میشه و وقتی که T هم میزاریم دیگه میتونیم درخواستمون از هر نوعی باشه input و out put میتونه باشه

این تعریف بهتری داده :

این کلاس هستش که میاد منطق درست کردن کلاس user رو hangle میکنه ، ورودی میاد Create User Command رو میگیره و بعد خروجی User میده

دقیقا همین داستان ها رو هم برای query داریم

https://mehmetozkaya.medium.com/cqrs-abstraction-layer-on-mediatr-in-net-8-microservices-f63304992a3f

https://code-maze.com/cqrs-mediatr-fluentvalidation/

خوب برای استفاده از mediatR میایم و از اینترفیس IRequest استفاده میکنیم که هم command و هم query رو داره انجام میده

برای استفاده ازش میایم و دو تا abstraction جدا ازش میسازیم

خوب بعد میایم TRespose رو از نوع generic type رو تعریف میکنیم و بعد از out استفاده میکنیم

بعد میایم دو تا abstraction جدا هم برای handlers ها تعریف میکنیم

خوب چرا میایم این interface ها رو تعیین میکنیم آیا اینترفیس های mediatR به اندازه کافی خوب نیست >؟ با درست کردن این abstraction ها ما انعطاف بیشتری داریم برای تغییر و اضافه کردن قابلیت های جدید

اینجا تعریفی که کرده اینه که ما میخوایم تمامی command ها idempotent باشند یعنی فقط یک بار اجرا بشه

خوب ما میتونیم ICommand inteface رو extent کنیم و یه IIdempotent Command Interface رو درست کنیم

https://code-maze.com/cqrs-mediatr-fluentvalidation/

خوب توی کد بالا میاد یه اینترفیس درست میکنه که خوده اون میاد و از اینترفیس mediatR ارث بری کرده و بعد گفته که TCommand باید بیاد و ICommand TResponse رو پیاده سازی کنه

خوب اینجا اول اومده از IRequest TResponse ارث بری کرده که یعنی میخواد اون رو extend کنه و ICommand داره میگه که خروجی هم از نوع TResponse هستش

بعد اومده از همین اینترفیسی که درست کردیم و قراره custumize اش کنیم در خط پایین استفاده کرده اومده از این اینترفیس برای یک کلاس abstract استفاده کرده و همین به ما این قابلیت رو میده که برای پیاده سازی Command و استفاده از logic اش در جاهای دیگه ازش استفاده کنیم

https://medium.com/@90mandalchandan/cqrs-architecture-how-it-works-5f18a36886ea

https://codewithmukesh.com/blog/cqrs-and-mediatr-in-aspnet-core/

Registering MediatR

As we have already installed the required package to our application, let’s register MediatR handlers to the application’s DI Container. Open up Program.cs file.

builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()));

خوب اینجا یه سری قابلیت جدید اضافه شده : https://learn.microsoft.com/en-us/ef/core/modeling/relationships/many-to-many

https://medium.com/@susithapb/understanding-singleton-scoped-and-transient-in-net-core-b7efede6c513#:~:text=A%20scope%20represents%20a%20certain,shared%20within%20a%20specific%20context.

error : Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly ‘System.Runtime, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’.

اونجا باید 64 win-X رو بنویسیم ارور حل میشه