وحید چشمی
وحید چشمی
خواندن ۲ دقیقه·۱ سال پیش

متد های Send و Publish در MediatR (C#)

در مقاله قبلی به طور مفصلی در مورد استفاده MediatR در #C صحبت کردم، اگر موفق به مطالعه آن نشدید به این لینک مراجعه کنید.


در این مقاله، میخواهم در مورد بهینه‌سازی این الگو صحبت کنم.

اما قبل از آن اجازه دهید در خصوص دو متد Send و Publish صحبت کنم.

متد Send

متد Send ارتباط بین اجزا را با استفاده از command و query تسهیل می بخشد. این متد کلیدی برای decouple کردن و همچنین جداسازی نگرانی ها (Separation of concerns) میباشد که منجر به افزایش انعطاف پذیری و نگهداری میشود.

در مقاله قبل اشاره کردم که برای ایجاد message و ارسال به handler نیاز داریم تا در controller خود با استفاده از متد send این عملیات را انجام دهیم.

به عنوان مثال:

[HttpGet] [Route(&quotGetAllBooks&quot)] public async Task<IActionResult> GetAllBooks() { var response=await _mediator.Send(new GetAllBooksQuery()); return Ok(response); }

متد Publish

متد Publish به عنوان مکانیزم ارتباطی one-way مورد استفاده قرار میگیرد، که به شما اجازه میدهد تا پیامها را به چندین subscriber ارسال کنید.

برای درک این موضوع به این مثال توجه کنید، فرض کنید شما طراحی Domain Driver Design را برای نرم‌افزار خود در پیش گرفته اید ، در این نرم‌افزار بعد از اینکه کاربری در سایت شما ثبت نام میکند شما با استفاده از Event sourcing ایمیلی را به ثبت نام کننده ارسال خواهید کرد، بدین منظور می توانید از publisher برای ارسال ایمیل استفاده کنید.

public class UserCreatedEvent : INotification { public int Id { get; set; } public string UserName { get; set; } = string.Empty; }
public class UserCreatedEventHandler : INotificationHandler<UserCreatedEvent> { private readonly IUserRepository _userRepository; private readonly INotificationFactory _notificationFactory; private readonly IMapper _mapper; public UserCreatedEventHandler(IUserRepository userRepository, INotificationFactory notificationFactory,IMapper mapper;) { _userRepository = userRepository; _notificationFactory= notificationFactory; _mapper=mapper } public async Task Handle(UserCreatedEvent notification, CancellationToken cancellationToken) { var userDetails=_userRepository.FindById(notification.id); var userCreatedDto=_mapper.Map<UserCreatedDto>(userDetails); var notificationServiceSender=_notificationFactory.CreateEmailSender(); await notificationServiceSender.ExecuteSender(userCreatedDto); } }

متد Handler اطلاعات مربوط به کاربر ثبت شده را توسط userRepository دریافت خواهد کرد و سپس یک متغیر DTO با استفاده از mapper ایجاد میکند، سپس با استفاده از الگوی factory methos یک سرویس ارسال ایمیل ایجاد میکند و در نهایت اطلاعات را به ایمیل کاربر ارسال میکند.

حال زمان آن فرا رسیده که از این notification استفاده کنیم:

await _mediator.Publish(notification);
برنامه نویسیسی شارپطراحی سایتطراحی سایت فروشگاهی
ســلام، من وحید هستم، چند سالی هست که دستم رو کیبورده و کد میزنم. دوست دارم چیزی که تجربه میکنم رو با شما به اشتراک بزارم.https://youtube.com/@devlife013
شاید از این پست‌ها خوشتان بیاید