{"id":76584,"date":"2024-09-13T04:47:56","date_gmt":"2024-09-13T01:17:56","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/what-is-clean-architecture-part-17-implementing-the-infrastructure-layer-with-csv-export-and-email-service-f8e\/"},"modified":"2024-09-13T04:47:56","modified_gmt":"2024-09-13T01:17:56","slug":"what-is-clean-architecture-part-17-implementing-the-infrastructure-layer-with-csv-export-and-email-service-f8e","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/what-is-clean-architecture-part-17-implementing-the-infrastructure-layer-with-csv-export-and-email-service-f8e\/","title":{"rendered":"\u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06a9 \u0686\u06cc\u0633\u062a: \u0642\u0633\u0645\u062a 17 &#8211; \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0628\u0627 CSV \u0635\u0627\u062f\u0631\u0627\u062a \u0648 \u0633\u0631\u0648\u06cc\u0633 \u0627\u06cc\u0645\u06cc\u0644"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang<br \/>\n            \u0645\u0642\u062f\u0645\u0647:\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0628\u0647 \u0633\u0627\u062e\u062a \u0622\u0646 \u0645\u06cc \u067e\u0631\u062f\u0627\u0632\u06cc\u0645 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u062f\u0631 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u062f\u0627\u062a \u0646\u062a\u060c \u0628\u0627 \u062a\u0645\u0631\u06a9\u0632 \u0628\u0631 \u062f\u0648 \u0639\u0645\u0644\u06a9\u0631\u062f \u06a9\u0644\u06cc\u062f\u06cc:<\/p>\n<p>\u0635\u0627\u062f\u0631 \u06a9\u0631\u062f\u0646 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0631\u0648\u06cc\u062f\u0627\u062f \u0628\u0647 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 CSV \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 CsvHelper \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647<br \/>\n\u0627\u0631\u0633\u0627\u0644 \u0627\u0639\u0644\u0627\u0646\u200c\u0647\u0627\u06cc \u0627\u06cc\u0645\u06cc\u0644 \u0647\u0646\u06af\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 SendGrid \u062e\u062f\u0645\u0627\u062a<\/p>\n<p>\u0628\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0646 \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06a9 \u0627\u0635\u0648\u0644\u060c \u0645\u0627 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0632 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0648\u0627\u0642\u0639\u06cc \u062c\u062f\u0627 \u0628\u0627\u0642\u06cc \u0645\u06cc \u0645\u0627\u0646\u062f. \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0627 \u062a\u0646\u0638\u06cc\u0645 \u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0631\u0648\u0698\u0647 \u0648 \u0633\u0627\u062e\u062a\u0646 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0645\u0631\u062d\u0644\u0647 \u0628\u0647 \u0645\u0631\u062d\u0644\u0647 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u0645.<\/p>\n<p>  1. \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/p>\n<p>\u0627\u06cc\u0646 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u062a\u0639\u0627\u0645\u0644\u0627\u062a \u0633\u06cc\u0633\u062a\u0645 \u062e\u0627\u0631\u062c\u06cc \u0645\u0627\u0646\u0646\u062f:<\/p>\n<p>\u0627\u0631\u0633\u0627\u0644 \u0627\u06cc\u0645\u06cc\u0644 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 \u0627\u06cc\u0645\u06cc\u0644 \u062e\u0627\u0631\u062c\u06cc (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c SendGrid).<br \/>\n\u0635\u0627\u062f\u0631\u0627\u062a \u062f\u0627\u062f\u0647 \u0647\u0627 \u0628\u0647 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc CSV \u0628\u0631\u0627\u06cc \u06af\u0632\u0627\u0631\u0634 \u06cc\u0627 \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0642\u0627\u0628\u0644 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0628\u0627\u0634\u062f\u060c \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u0647\u0627 (\u0631\u0627\u0628\u0637 \u0647\u0627) \u0631\u0627 \u0628\u0647 \u0642\u0633\u0645\u062a \u062c\u062f\u0627 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0644\u0627\u06cc\u0647 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0648 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0647\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc \u0631\u0627 \u062f\u0631 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a.<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 1: \u0644\u0627\u06cc\u0647 Infrastructure \u0631\u0627 \u0628\u0647 Solution \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u062f\u0631 \u0631\u0627\u0647 \u062d\u0644 \u062e\u0648\u062f\u060c \u0631\u0648\u06cc \u0646\u0627\u0645 \u0631\u0627\u0647 \u062d\u0644 \u0631\u0627\u0633\u062a \u06a9\u0644\u06cc\u06a9 \u06a9\u0631\u062f\u0647 \u0648 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f \u0627\u0641\u0632\u0648\u062f\u0646 > \u067e\u0631\u0648\u0698\u0647 \u062c\u062f\u06cc\u062f.<br \/>\n\u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u06a9\u0644\u0627\u0633 \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u062a\u0627\u06cc\u067e \u06a9\u0631\u062f\u0647 \u0648 \u0646\u0627\u0645\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f GloboTicket.TicketManagement.Infrastructure.<\/p>\n<p>  2. \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f \u0635\u0627\u062f\u0631\u0627\u062a CSV<\/p>\n<p>\u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0627\u0628\u062a\u062f\u0627 \u0639\u0645\u0644\u06a9\u0631\u062f \u0635\u0627\u062f\u0631\u0627\u062a CSV \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 CsvHelper \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 2.1: \u0642\u0631\u0627\u0631\u062f\u0627\u062f \u0635\u0627\u062f\u0631\u0627\u062a CSV \u0631\u0627 \u062f\u0631 \u0644\u0627\u06cc\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u062f\u0631 \u0634\u0645\u0627 \u0644\u0627\u06cc\u0647 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc\u060c \u067e\u06cc\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f \u0628\u0647 Contracts\/Infrastructure.<br \/>\n\u06cc\u06a9 \u0631\u0627\u0628\u0637 \u062c\u062f\u06cc\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f ICsvExporter.cs:<\/p>\n<p>namespace GloboTicket.TicketManagement.Application.Contracts.Infrastructure<br \/>\n{<br \/>\n    public interface ICsvExporter<br \/>\n    {<br \/>\n        byte[] ExportEventsToCsv(ListEventExportDto&gt; eventExportDtos);<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 2.2: \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc CsvExporter \u062f\u0631 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/p>\n<p>\u062d\u0627\u0644\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0645\u0646\u0637\u0642 \u0635\u0627\u062f\u0631\u0627\u062a \u0648\u0627\u0642\u0639\u06cc \u0631\u0627 \u062f\u0631 \u0622\u0646 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a.<\/p>\n<p>\u062f\u0631 \u0634\u0645\u0627 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u067e\u0631\u0648\u0698\u0647\u060c \u067e\u0648\u0634\u0647 \u0627\u06cc \u0628\u0647 \u0646\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f FileExport.<br \/>\n\u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u0628\u0647 \u0646\u0627\u0645 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f CsvExporter.cs:<\/p>\n<p>using CsvHelper;<br \/>\nusing System.IO;<br \/>\nusing System.Text;<br \/>\nusing GloboTicket.TicketManagement.Application.Contracts.Infrastructure;<br \/>\nusing GloboTicket.TicketManagement.Application.Features.Events.Queries.GetEventsExport;<\/p>\n<p>namespace GloboTicket.TicketManagement.Infrastructure.FileExport<br \/>\n{<br \/>\n    public class CsvExporter : ICsvExporter<br \/>\n    {<br \/>\n        public byte[] ExportEventsToCsv(ListEventExportDto&gt; eventExportDtos)<br \/>\n        {<br \/>\n            using var memoryStream = new MemoryStream();<br \/>\n            using (var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8))<br \/>\n            {<br \/>\n                using var csvWriter = new CsvWriter(streamWriter);<br \/>\n                csvWriter.WriteRecords(eventExportDtos);  \/\/ Write event records to CSV<br \/>\n            }<\/p>\n<p>            return memoryStream.ToArray();  \/\/ Return CSV as byte array<br \/>\n        }<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u0647\u062f\u0641: \u0627\u06cc\u0646 \u06a9\u0644\u0627\u0633 \u0644\u06cc\u0633\u062a\u06cc \u0627\u0632 EventExportDto \u0628\u0647 \u0641\u0631\u0645\u062a CSV \u0627\u0634\u06cc\u0627\u0621 \u0645\u06cc \u062f\u0647\u062f \u0648 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0622\u0631\u0627\u06cc\u0647 \u0628\u0627\u06cc\u062a\u06cc \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f.<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 2.3: \u0648\u06cc\u0698\u06af\u06cc \u0635\u0627\u062f\u0631\u0627\u062a CSV \u0631\u0627 \u062f\u0631 \u0644\u0627\u06cc\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u060c \u0645\u0627 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647 \u0627\u06cc \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0645\u0633\u0626\u0648\u0644 \u0635\u0627\u062f\u0631\u0627\u062a \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n<p>\u062f\u0631 \u0644\u0627\u06cc\u0647 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc\u060c \u067e\u06cc\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f \u0628\u0647 Features\/Events\/Queries\/GetEventsExport.<\/p>\n<p>\u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u0632\u06cc\u0631 \u0631\u0627 \u0645\u0631\u062d\u0644\u0647 \u0628\u0647 \u0645\u0631\u062d\u0644\u0647 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>EventExportDto.cs:<\/p>\n<p>namespace GloboTicket.TicketManagement.Application.Features.Events.Queries.GetEventsExport<br \/>\n{<br \/>\n    public class EventExportDto<br \/>\n    {<br \/>\n        public Guid EventId { get; set; }<br \/>\n        public string Name { get; set; } = string.Empty;<br \/>\n        public DateTime Date { get; set; }<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>EventExportFileVm.cs:<\/p>\n<p>namespace GloboTicket.TicketManagement.Application.Features.Events.Queries.GetEventsExport<br \/>\n{<br \/>\n    public class EventExportFileVm<br \/>\n    {<br \/>\n        public string EventExportFileName { get; set; } = string.Empty;<br \/>\n        public string ContentType { get; set; } = string.Empty;<br \/>\n        public byte[]? Data { get; set; }<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>GetEventsExportQuery.cs:<\/p>\n<p>using MediatR;<\/p>\n<p>namespace GloboTicket.TicketManagement.Application.Features.Events.Queries.GetEventsExport<br \/>\n{<br \/>\n    public class GetEventsExportQuery : IRequestEventExportFileVm&gt;<br \/>\n    {<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>GetEventsExportQueryHandler.cs:<\/p>\n<p>using MediatR;<br \/>\nusing AutoMapper;<br \/>\nusing GloboTicket.TicketManagement.Application.Contracts.Infrastructure;<br \/>\nusing GloboTicket.TicketManagement.Domain.Entities;<\/p>\n<p>namespace GloboTicket.TicketManagement.Application.Features.Events.Queries.GetEventsExport<br \/>\n{<br \/>\n    public class GetEventsExportQueryHandler : IRequestHandlerGetEventsExportQuery, EventExportFileVm&gt;<br \/>\n    {<br \/>\n        private readonly IAsyncRepositoryEvent&gt; _eventRepository;<br \/>\n        private readonly IMapper _mapper;<br \/>\n        private readonly ICsvExporter _csvExporter;<\/p>\n<p>        public GetEventsExportQueryHandler(IMapper mapper, IAsyncRepositoryEvent&gt; eventRepository, ICsvExporter csvExporter)<br \/>\n        {<br \/>\n            _mapper = mapper;<br \/>\n            _eventRepository = eventRepository;<br \/>\n            _csvExporter = csvExporter;<br \/>\n        }<\/p>\n<p>        public async TaskEventExportFileVm&gt; Handle(GetEventsExportQuery request, CancellationToken cancellationToken)<br \/>\n        {<br \/>\n            var allEvents = _mapper.MapListEventExportDto&gt;&gt;((await _eventRepository.ListAllAsync()).OrderBy(x =&gt; x.Date));<br \/>\n            var fileData = _csvExporter.ExportEventsToCsv(allEvents);<\/p>\n<p>            return new EventExportFileVm<br \/>\n            {<br \/>\n                ContentType = &#8220;text\/csv&#8221;,<br \/>\n                Data = fileData,<br \/>\n                EventExportFileName = $&#8221;{Guid.NewGuid()}.csv&#8221;<br \/>\n            };<br \/>\n        }<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  3. \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f \u0627\u06cc\u0645\u06cc\u0644 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 SendGrid<\/p>\n<p>\u0628\u0639\u062f\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0642\u0627\u0628\u0644\u06cc\u062a \u0627\u06cc\u0645\u06cc\u0644 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645 SendGrid.<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 3.1: \u0642\u0631\u0627\u0631\u062f\u0627\u062f \u062e\u062f\u0645\u0627\u062a \u0627\u06cc\u0645\u06cc\u0644 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u062f\u0631 \u0644\u0627\u06cc\u0647 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc\u060c \u067e\u06cc\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f \u0628\u0647 Contracts\/Infrastructure.<br \/>\n\u06cc\u06a9 \u0631\u0627\u0628\u0637 \u062c\u062f\u06cc\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f IEmailService.cs:<\/p>\n<p>namespace GloboTicket.TicketManagement.Application.Contracts.Infrastructure<br \/>\n{<br \/>\n    public interface IEmailService<br \/>\n    {<br \/>\n        Taskbool&gt; SendEmail(Email email);<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 3.2: \u0633\u0631\u0648\u06cc\u0633 \u0627\u06cc\u0645\u06cc\u0644 \u0631\u0627 \u062f\u0631 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u067e\u0631\u0648\u0698\u0647\u060c \u06cc\u06a9 \u067e\u0648\u0634\u0647 \u0628\u0647 \u0646\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f Mail.<br \/>\n\u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u062c\u062f\u06cc\u062f \u0628\u0647 \u0646\u0627\u0645 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f EmailService.cs:<\/p>\n<p>using GloboTicket.TicketManagement.Application.Contracts.Infrastructure;<br \/>\nusing GloboTicket.TicketManagement.Application.Models.Mail;<br \/>\nusing Microsoft.Extensions.Options;<br \/>\nusing SendGrid;<br \/>\nusing SendGrid.Helpers.Mail;<br \/>\nusing Microsoft.Extensions.Logging;<\/p>\n<p>namespace GloboTicket.TicketManagement.Infrastructure.Mail<br \/>\n{<br \/>\n    public class EmailService : IEmailService<br \/>\n    {<br \/>\n        private readonly EmailSettings _emailSettings;<br \/>\n        private readonly ILoggerEmailService&gt; _logger;<\/p>\n<p>        public EmailService(IOptionsEmailSettings&gt; mailSettings, ILoggerEmailService&gt; logger)<br \/>\n        {<br \/>\n            _emailSettings = mailSettings.Value;<br \/>\n            _logger = logger;<br \/>\n        }<\/p>\n<p>        public async Taskbool&gt; SendEmail(Email email)<br \/>\n        {<br \/>\n            var client = new SendGridClient(_emailSettings.ApiKey);<br \/>\n            var sendGridMessage = MailHelper.CreateSingleEmail(<br \/>\n                new EmailAddress(_emailSettings.FromAddress, _emailSettings.FromName),<br \/>\n                new EmailAddress(email.To),<br \/>\n                email.Subject,<br \/>\n                email.Body,<br \/>\n                email.Body);<\/p>\n<p>            var response = await client.SendEmailAsync(sendGridMessage);<\/p>\n<p>            _logger.LogInformation(&#8220;Email sent&#8221;);<\/p>\n<p>            return response.StatusCode == System.Net.HttpStatusCode.Accepted || response.StatusCode == System.Net.HttpStatusCode.OK;<br \/>\n        }<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0645\u0631\u062d\u0644\u0647 3.3: \u0627\u0631\u0633\u0627\u0644 \u0627\u06cc\u0645\u06cc\u0644 \u0627\u0632 \u0644\u0627\u06cc\u0647 \u0628\u0631\u0646\u0627\u0645\u0647<\/p>\n<p>\u062d\u0627\u0644\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0627\u0632 IEmailService \u062f\u0631 CreateEventCommandHandler \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u0627\u06cc\u0645\u06cc\u0644 \u0647\u0646\u06af\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0631\u0648\u06cc\u062f\u0627\u062f.<\/p>\n<p>\u062d\u0631\u06a9\u062a \u0628\u0647 Features\/Events\/Commands\/CreateEvent.<br \/>\n\u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f CreateEventCommandHandler.cs \u0648 \u06a9\u062f \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f:<\/p>\n<p>using AutoMapper;<br \/>\nusing GloboTicket.TicketManagement.Application.Contracts.Infrastructure;<br \/>\nusing GloboTicket.TicketManagement.Application.Contracts.Persistence;<br \/>\nusing GloboTicket.TicketManagement.Application.Models.Mail;<br \/>\nusing GloboTicket.TicketManagement.Domain.Entities;<br \/>\nusing MediatR;<\/p>\n<p>namespace GloboTicket.TicketManagement.Application.Features.Events.Commands.CreateEvent<br \/>\n{<br \/>\n    public class CreateEventCommandHandler : IRequestHandlerCreateEventCommand, Guid&gt;<br \/>\n    {<br \/>\n        private readonly IEventRepository _eventRepository;<br \/>\n        private readonly IMapper _mapper;<br \/>\n        private readonly IEmailService _emailService;<\/p>\n<p>        public CreateEventCommandHandler(IMapper mapper, IEventRepository eventRepository, IEmailService emailService)<br \/>\n        {<br \/>\n            _mapper = mapper;<br \/>\n            _eventRepository = eventRepository;<br \/>\n            _emailService = emailService;<br \/>\n        }<\/p>\n<p>        public async TaskGuid&gt; Handle(CreateEventCommand request, CancellationToken cancellationToken)<br \/>\n        {<br \/>\n            var @event = _mapper.MapEvent&gt;(request);<\/p>\n<p>            var validator = new CreateEventCommandValidator(_eventRepository);<br \/>\n            var validationResult = await validator.ValidateAsync(request);<\/p>\n<p>            if (validationResult.Errors.Count &gt; 0)<br \/>\n                throw new Exceptions.ValidationException(validationResult);<\/p>\n<p>            @event = await _eventRepository.AddAsync(@event);<\/p>\n<p>            \/\/ Sending email notification to admin<br \/>\n            var email = new Email<br \/>\n            {<br \/>\n                To = &#8220;admin@example.com&#8221;,<br \/>\n                Subject = &#8220;A new event was created&#8221;,<br \/>\n                Body = $&#8221;A new event was created: {request}&#8221;<br \/>\n            };<\/p>\n<p>            try<br \/>\n            {<br \/>\n                await _email<\/p>\n<p>Service.SendEmail(email);<br \/>\n            }<br \/>\n            catch (Exception ex)<br \/>\n            {<br \/>\n                \/\/ Log the error and continue<br \/>\n            }<\/p>\n<p>            return @event.EventId;<br \/>\n        }<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  4. \u062b\u0628\u062a \u062e\u062f\u0645\u0627\u062a \u062f\u0631 \u0638\u0631\u0641 DI<\/p>\n<p>\u0628\u0631\u0627\u06cc \u062a\u06a9\u0645\u06cc\u0644 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a\u060c \u0628\u0627\u06cc\u062f \u062b\u0628\u062a \u0646\u0627\u0645 \u06a9\u0646\u06cc\u062f EmailService \u0648 CsvExporter \u062f\u0631 \u0638\u0631\u0641 DI<\/p>\n<p>\u062f\u0631 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u067e\u0631\u0648\u0698\u0647\u060c \u062d\u0631\u06a9\u062a \u0628\u0647 InfrastructureServiceRegistration.cs:<\/p>\n<p>public static class InfrastructureServiceRegistration<br \/>\n{<br \/>\n    public static IServiceCollection AddInfrastructureServices(this IServiceCollection services, IConfiguration configuration)<br \/>\n    {<br \/>\n        services.ConfigureEmailSettings&gt;(configuration.GetSection(&#8220;EmailSettings&#8221;));<br \/>\n        services.AddTransientIEmailService, EmailService&gt;();<br \/>\n        services.AddTransientICsvExporter, CsvExporter&gt;();<\/p>\n<p>        return services;<br \/>\n    }<br \/>\n}<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>\u062d\u062a\u0645\u0627 \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0631\u0627 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u06a9\u0646\u06cc\u062f Program.cs \u067e\u0631\u0648\u0698\u0647 API \u0634\u0645\u0627:<\/p>\n<p>builder.Services.AddInfrastructureServices(builder.Configuration);<\/p>\n<p>    \u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/p>\n<p>    \u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/p>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc:<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647\u060c \u0645\u0627 \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u06cc\u0645 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0628\u0627 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632:<\/p>\n<p>\u0635\u0627\u062f\u0631\u0627\u062a CSV \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 CsvHelper \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647<\/p>\n<p>\u0627\u0631\u0633\u0627\u0644 \u0627\u06cc\u0645\u06cc\u0644 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 SendGrid \u062e\u062f\u0645\u0627\u062a<\/p>\n<p>\u0628\u0627 \u067e\u0627\u06cc\u0628\u0646\u062f\u06cc \u0628\u0647 \u0627\u0635\u0648\u0644 \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06a9\u060c \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0631\u062f\u06cc\u0645 \u06a9\u0647 \u0647\u0631 \u062f\u0648 \u0644\u0627\u06cc\u0647 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0648 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u062c\u062f\u0627 \u0628\u0627\u0642\u06cc \u0645\u06cc \u0645\u0627\u0646\u062f \u0648 \u0633\u06cc\u0633\u062a\u0645 \u0631\u0627 \u0642\u0627\u0628\u0644 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0648 \u06af\u0633\u062a\u0631\u0634 \u0645\u06cc \u062f\u0647\u062f. \u0628\u0631\u0627\u06cc \u06a9\u062f \u0645\u0646\u0628\u0639 \u06a9\u0627\u0645\u0644\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0645\u062e\u0632\u0646 GitHub \u062f\u06cc\u062f\u0646 \u06a9\u0646\u06cc\u062f: https:\/\/github.com\/mohamedtayel1980\/clean-architecture<\/p>\n<div data-article-id=\"1998691\" id=\"article-body\">\n<p><strong>\u0645\u0642\u062f\u0645\u0647:<\/strong><br \/>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0628\u0647 \u0633\u0627\u062e\u062a \u0622\u0646 \u0645\u06cc \u067e\u0631\u062f\u0627\u0632\u06cc\u0645 <strong>\u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/strong> \u062f\u0631 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u062f\u0627\u062a \u0646\u062a\u060c \u0628\u0627 \u062a\u0645\u0631\u06a9\u0632 \u0628\u0631 \u062f\u0648 \u0639\u0645\u0644\u06a9\u0631\u062f \u06a9\u0644\u06cc\u062f\u06cc:<\/p>\n<ol>\n<li>\u0635\u0627\u062f\u0631 \u06a9\u0631\u062f\u0646 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0631\u0648\u06cc\u062f\u0627\u062f \u0628\u0647 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 CSV \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <code>CsvHelper<\/code> \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647<\/li>\n<li>\u0627\u0631\u0633\u0627\u0644 \u0627\u0639\u0644\u0627\u0646\u200c\u0647\u0627\u06cc \u0627\u06cc\u0645\u06cc\u0644 \u0647\u0646\u06af\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <strong>SendGrid<\/strong> \u062e\u062f\u0645\u0627\u062a<\/li>\n<\/ol>\n<p>\u0628\u0627 \u062f\u0646\u0628\u0627\u0644 \u06a9\u0631\u062f\u0646 <strong>\u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06a9<\/strong> \u0627\u0635\u0648\u0644\u060c \u0645\u0627 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0632 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0648\u0627\u0642\u0639\u06cc \u062c\u062f\u0627 \u0628\u0627\u0642\u06cc \u0645\u06cc \u0645\u0627\u0646\u062f. \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0627 \u062a\u0646\u0638\u06cc\u0645 \u0633\u0627\u062e\u062a\u0627\u0631 \u067e\u0631\u0648\u0698\u0647 \u0648 \u0633\u0627\u062e\u062a\u0646 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u0645\u0631\u062d\u0644\u0647 \u0628\u0647 \u0645\u0631\u062d\u0644\u0647 \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u0645.<\/p>\n<hr\/>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u062a\u063a\u06cc\u06cc\u0631 \u0648\u0636\u0639\u06cc\u062a \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/what-is-clean-architecture-part-17-implementing-the-infrastructure-layer-with-csv-export-and-email-service-f8e\/#1_%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D9%84%D8%A7%DB%8C%D9%87_%D8%B2%DB%8C%D8%B1%D8%B3%D8%A7%D8%AE%D8%AA\" >1. \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/what-is-clean-architecture-part-17-implementing-the-infrastructure-layer-with-csv-export-and-email-service-f8e\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%D9%84%D8%A7%DB%8C%D9%87_Infrastructure_%D8%B1%D8%A7_%D8%A8%D9%87_Solution_%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 1: \u0644\u0627\u06cc\u0647 Infrastructure \u0631\u0627 \u0628\u0647 Solution \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/what-is-clean-architecture-part-17-implementing-the-infrastructure-layer-with-csv-export-and-email-service-f8e\/#2_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF_%D8%B5%D8%A7%D8%AF%D8%B1%D8%A7%D8%AA_CSV\" >2. \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f \u0635\u0627\u062f\u0631\u0627\u062a CSV<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/what-is-clean-architecture-part-17-implementing-the-infrastructure-layer-with-csv-export-and-email-service-f8e\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_21_%D9%82%D8%B1%D8%A7%D8%B1%D8%AF%D8%A7%D8%AF_%D8%B5%D8%A7%D8%AF%D8%B1%D8%A7%D8%AA_CSV_%D8%B1%D8%A7_%D8%AF%D8%B1_%D9%84%D8%A7%DB%8C%D9%87_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%AA%D8%B9%D8%B1%DB%8C%D9%81_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 2.1: \u0642\u0631\u0627\u0631\u062f\u0627\u062f \u0635\u0627\u062f\u0631\u0627\u062a CSV \u0631\u0627 \u062f\u0631 \u0644\u0627\u06cc\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/what-is-clean-architecture-part-17-implementing-the-infrastructure-layer-with-csv-export-and-email-service-f8e\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_22_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_CsvExporter_%D8%AF%D8%B1_%D9%84%D8%A7%DB%8C%D9%87_%D8%B2%DB%8C%D8%B1%D8%B3%D8%A7%D8%AE%D8%AA\" >\u0645\u0631\u062d\u0644\u0647 2.2: \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc CsvExporter \u062f\u0631 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/what-is-clean-architecture-part-17-implementing-the-infrastructure-layer-with-csv-export-and-email-service-f8e\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_23_%D9%88%DB%8C%DA%98%DA%AF%DB%8C_%D8%B5%D8%A7%D8%AF%D8%B1%D8%A7%D8%AA_CSV_%D8%B1%D8%A7_%D8%AF%D8%B1_%D9%84%D8%A7%DB%8C%D9%87_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 2.3: \u0648\u06cc\u0698\u06af\u06cc \u0635\u0627\u062f\u0631\u0627\u062a CSV \u0631\u0627 \u062f\u0631 \u0644\u0627\u06cc\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/what-is-clean-architecture-part-17-implementing-the-infrastructure-layer-with-csv-export-and-email-service-f8e\/#3_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF_%D8%A7%DB%8C%D9%85%DB%8C%D9%84_%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_SendGrid\" >3. \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f \u0627\u06cc\u0645\u06cc\u0644 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 SendGrid<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/what-is-clean-architecture-part-17-implementing-the-infrastructure-layer-with-csv-export-and-email-service-f8e\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_31_%D9%82%D8%B1%D8%A7%D8%B1%D8%AF%D8%A7%D8%AF_%D8%AE%D8%AF%D9%85%D8%A7%D8%AA_%D8%A7%DB%8C%D9%85%DB%8C%D9%84_%D8%B1%D8%A7_%D8%AA%D8%B9%D8%B1%DB%8C%D9%81_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 3.1: \u0642\u0631\u0627\u0631\u062f\u0627\u062f \u062e\u062f\u0645\u0627\u062a \u0627\u06cc\u0645\u06cc\u0644 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/what-is-clean-architecture-part-17-implementing-the-infrastructure-layer-with-csv-export-and-email-service-f8e\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_32_%D8%B3%D8%B1%D9%88%DB%8C%D8%B3_%D8%A7%DB%8C%D9%85%DB%8C%D9%84_%D8%B1%D8%A7_%D8%AF%D8%B1_%D9%84%D8%A7%DB%8C%D9%87_%D8%B2%DB%8C%D8%B1%D8%B3%D8%A7%D8%AE%D8%AA_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF\" >\u0645\u0631\u062d\u0644\u0647 3.2: \u0633\u0631\u0648\u06cc\u0633 \u0627\u06cc\u0645\u06cc\u0644 \u0631\u0627 \u062f\u0631 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/what-is-clean-architecture-part-17-implementing-the-infrastructure-layer-with-csv-export-and-email-service-f8e\/#%D9%85%D8%B1%D8%AD%D9%84%D9%87_33_%D8%A7%D8%B1%D8%B3%D8%A7%D9%84_%D8%A7%DB%8C%D9%85%DB%8C%D9%84_%D8%A7%D8%B2_%D9%84%D8%A7%DB%8C%D9%87_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87\" >\u0645\u0631\u062d\u0644\u0647 3.3: \u0627\u0631\u0633\u0627\u0644 \u0627\u06cc\u0645\u06cc\u0644 \u0627\u0632 \u0644\u0627\u06cc\u0647 \u0628\u0631\u0646\u0627\u0645\u0647<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/what-is-clean-architecture-part-17-implementing-the-infrastructure-layer-with-csv-export-and-email-service-f8e\/#4_%D8%AB%D8%A8%D8%AA_%D8%AE%D8%AF%D9%85%D8%A7%D8%AA_%D8%AF%D8%B1_%D8%B8%D8%B1%D9%81_DI\" >4. \u062b\u0628\u062a \u062e\u062f\u0645\u0627\u062a \u062f\u0631 \u0638\u0631\u0641 DI<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/nabfollower.com\/blog\/what-is-clean-architecture-part-17-implementing-the-infrastructure-layer-with-csv-export-and-email-service-f8e\/#%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\" >\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc:<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"1_%D8%B1%D8%A7%D9%87_%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C_%D9%84%D8%A7%DB%8C%D9%87_%D8%B2%DB%8C%D8%B1%D8%B3%D8%A7%D8%AE%D8%AA\"><\/span>\n<p>  <strong>1. \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u06cc\u0646 <strong>\u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/strong> \u062a\u0639\u0627\u0645\u0644\u0627\u062a \u0633\u06cc\u0633\u062a\u0645 \u062e\u0627\u0631\u062c\u06cc \u0645\u0627\u0646\u0646\u062f:<\/p>\n<ul>\n<li>\u0627\u0631\u0633\u0627\u0644 \u0627\u06cc\u0645\u06cc\u0644 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06cc\u06a9 \u0633\u0631\u0648\u06cc\u0633 \u0627\u06cc\u0645\u06cc\u0644 \u062e\u0627\u0631\u062c\u06cc (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c SendGrid).<\/li>\n<li>\u0635\u0627\u062f\u0631\u0627\u062a \u062f\u0627\u062f\u0647 \u0647\u0627 \u0628\u0647 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc CSV \u0628\u0631\u0627\u06cc \u06af\u0632\u0627\u0631\u0634 \u06cc\u0627 \u062a\u062c\u0632\u06cc\u0647 \u0648 \u062a\u062d\u0644\u06cc\u0644.<\/li>\n<\/ul>\n<p>\u0628\u0631\u0627\u06cc \u0627\u06cc\u0646\u06a9\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0642\u0627\u0628\u0644 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0628\u0627\u0634\u062f\u060c \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u0647\u0627 (\u0631\u0627\u0628\u0637 \u0647\u0627) \u0631\u0627 \u0628\u0647 \u0642\u0633\u0645\u062a \u062c\u062f\u0627 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <strong>\u0644\u0627\u06cc\u0647 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc<\/strong> \u0648 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0647\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc \u0631\u0627 \u062f\u0631 <strong>\u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/strong>.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%D9%84%D8%A7%DB%8C%D9%87_Infrastructure_%D8%B1%D8%A7_%D8%A8%D9%87_Solution_%D8%A7%D8%B6%D8%A7%D9%81%D9%87_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  <strong>\u0645\u0631\u062d\u0644\u0647 1: \u0644\u0627\u06cc\u0647 Infrastructure \u0631\u0627 \u0628\u0647 Solution \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ol>\n<li>\u062f\u0631 \u0631\u0627\u0647 \u062d\u0644 \u062e\u0648\u062f\u060c \u0631\u0648\u06cc \u0646\u0627\u0645 \u0631\u0627\u0647 \u062d\u0644 \u0631\u0627\u0633\u062a \u06a9\u0644\u06cc\u06a9 \u06a9\u0631\u062f\u0647 \u0648 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f <strong>\u0627\u0641\u0632\u0648\u062f\u0646 > \u067e\u0631\u0648\u0698\u0647 \u062c\u062f\u06cc\u062f<\/strong>.<\/li>\n<li>\u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f <strong>\u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u06a9\u0644\u0627\u0633<\/strong> \u067e\u0631\u0648\u0698\u0647 \u0631\u0627 \u062a\u0627\u06cc\u067e \u06a9\u0631\u062f\u0647 \u0648 \u0646\u0627\u0645\u06af\u0630\u0627\u0631\u06cc \u06a9\u0646\u06cc\u062f <code>GloboTicket.TicketManagement.Infrastructure<\/code>.<\/li>\n<\/ol>\n<p><\/p>\n<hr\/>\n<h3><span class=\"ez-toc-section\" id=\"2_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF_%D8%B5%D8%A7%D8%AF%D8%B1%D8%A7%D8%AA_CSV\"><\/span>\n<p>  <strong>2. \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f \u0635\u0627\u062f\u0631\u0627\u062a CSV<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0627\u0628\u062a\u062f\u0627 \u0639\u0645\u0644\u06a9\u0631\u062f \u0635\u0627\u062f\u0631\u0627\u062a CSV \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <code>CsvHelper<\/code> \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647<\/p>\n<h4><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_21_%D9%82%D8%B1%D8%A7%D8%B1%D8%AF%D8%A7%D8%AF_%D8%B5%D8%A7%D8%AF%D8%B1%D8%A7%D8%AA_CSV_%D8%B1%D8%A7_%D8%AF%D8%B1_%D9%84%D8%A7%DB%8C%D9%87_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%AA%D8%B9%D8%B1%DB%8C%D9%81_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  <strong>\u0645\u0631\u062d\u0644\u0647 2.1: \u0642\u0631\u0627\u0631\u062f\u0627\u062f \u0635\u0627\u062f\u0631\u0627\u062a CSV \u0631\u0627 \u062f\u0631 \u0644\u0627\u06cc\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ol>\n<li>\u062f\u0631 \u0634\u0645\u0627 <strong>\u0644\u0627\u06cc\u0647 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc<\/strong>\u060c \u067e\u06cc\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f \u0628\u0647 <code>Contracts\/Infrastructure<\/code>.<\/li>\n<li>\u06cc\u06a9 \u0631\u0627\u0628\u0637 \u062c\u062f\u06cc\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>ICsvExporter.cs<\/code>:<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8iop86txz0epwep60rp7.png\" alt=\"\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"412\" height=\"119\" title=\"\"><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"k\">namespace<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Application.Contracts.Infrastructure<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">interface<\/span> <span class=\"nc\">ICsvExporter<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"nf\">ExportEventsToCsv<\/span><span class=\"p\">(<\/span><span class=\"n\">List<\/span><span class=\"p\"><span class=\"n\">EventExportDto<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">eventExportDtos<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h4><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_22_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_CsvExporter_%D8%AF%D8%B1_%D9%84%D8%A7%DB%8C%D9%87_%D8%B2%DB%8C%D8%B1%D8%B3%D8%A7%D8%AE%D8%AA\"><\/span>\n<p>  <strong>\u0645\u0631\u062d\u0644\u0647 2.2: \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc <code>CsvExporter<\/code> \u062f\u0631 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>\u062d\u0627\u0644\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0645\u0646\u0637\u0642 \u0635\u0627\u062f\u0631\u0627\u062a \u0648\u0627\u0642\u0639\u06cc \u0631\u0627 \u062f\u0631 \u0622\u0646 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645 <strong>\u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/strong>.<\/p>\n<ol>\n<li>\u062f\u0631 \u0634\u0645\u0627 <strong>\u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/strong> \u067e\u0631\u0648\u0698\u0647\u060c \u067e\u0648\u0634\u0647 \u0627\u06cc \u0628\u0647 \u0646\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>FileExport<\/code>.<\/li>\n<li>\u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u0628\u0647 \u0646\u0627\u0645 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>CsvExporter.cs<\/code>:<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frb8loomntoq5mz0qv1fb.png\" alt=\"\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"451\" height=\"106\" title=\"\"><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"k\">using<\/span> <span class=\"nn\">CsvHelper<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">System.IO<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">System.Text<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Application.Contracts.Infrastructure<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Application.Features.Events.Queries.GetEventsExport<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">namespace<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Infrastructure.FileExport<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">CsvExporter<\/span> <span class=\"p\">:<\/span> <span class=\"n\">ICsvExporter<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">public<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[]<\/span> <span class=\"nf\">ExportEventsToCsv<\/span><span class=\"p\">(<\/span><span class=\"n\">List<\/span><span class=\"p\"><span class=\"n\">EventExportDto<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">eventExportDtos<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">memoryStream<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">MemoryStream<\/span><span class=\"p\">();<\/span>\n            <span class=\"k\">using<\/span> <span class=\"p\">(<\/span><span class=\"kt\">var<\/span> <span class=\"n\">streamWriter<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">StreamWriter<\/span><span class=\"p\">(<\/span><span class=\"n\">memoryStream<\/span><span class=\"p\">,<\/span> <span class=\"n\">Encoding<\/span><span class=\"p\">.<\/span><span class=\"n\">UTF8<\/span><span class=\"p\">))<\/span>\n            <span class=\"p\">{<\/span>\n                <span class=\"k\">using<\/span> <span class=\"nn\">var<\/span> <span class=\"n\">csvWriter<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">CsvWriter<\/span><span class=\"p\">(<\/span><span class=\"n\">streamWriter<\/span><span class=\"p\">);<\/span>\n                <span class=\"n\">csvWriter<\/span><span class=\"p\">.<\/span><span class=\"nf\">WriteRecords<\/span><span class=\"p\">(<\/span><span class=\"n\">eventExportDtos<\/span><span class=\"p\">);<\/span>  <span class=\"c1\">\/\/ Write event records to CSV<\/span>\n            <span class=\"p\">}<\/span>\n\n            <span class=\"k\">return<\/span> <span class=\"n\">memoryStream<\/span><span class=\"p\">.<\/span><span class=\"nf\">ToArray<\/span><span class=\"p\">();<\/span>  <span class=\"c1\">\/\/ Return CSV as byte array<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ul>\n<li>\n<strong>\u0647\u062f\u0641<\/strong>: \u0627\u06cc\u0646 \u06a9\u0644\u0627\u0633 \u0644\u06cc\u0633\u062a\u06cc \u0627\u0632 <code>EventExportDto<\/code> \u0628\u0647 \u0641\u0631\u0645\u062a CSV \u0627\u0634\u06cc\u0627\u0621 \u0645\u06cc \u062f\u0647\u062f \u0648 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0622\u0631\u0627\u06cc\u0647 \u0628\u0627\u06cc\u062a\u06cc \u0628\u0631\u0645\u06cc \u06af\u0631\u062f\u0627\u0646\u062f.<\/li>\n<\/ul>\n<h4><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_23_%D9%88%DB%8C%DA%98%DA%AF%DB%8C_%D8%B5%D8%A7%D8%AF%D8%B1%D8%A7%D8%AA_CSV_%D8%B1%D8%A7_%D8%AF%D8%B1_%D9%84%D8%A7%DB%8C%D9%87_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  <strong>\u0645\u0631\u062d\u0644\u0647 2.3: \u0648\u06cc\u0698\u06af\u06cc \u0635\u0627\u062f\u0631\u0627\u062a CSV \u0631\u0627 \u062f\u0631 \u0644\u0627\u06cc\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>\u062f\u0631 \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u060c \u0645\u0627 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647 \u0627\u06cc \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0645\u0633\u0626\u0648\u0644 \u0635\u0627\u062f\u0631\u0627\u062a \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n<ol>\n<li>\u062f\u0631 <strong>\u0644\u0627\u06cc\u0647 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc<\/strong>\u060c \u067e\u06cc\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f \u0628\u0647 <code>Features\/Events\/Queries\/GetEventsExport<\/code>.<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcyvzn90gtt9o7456dq9r.png\" alt=\"\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"468\" height=\"358\" title=\"\"><\/p>\n<ol>\n<li>\u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u0632\u06cc\u0631 \u0631\u0627 \u0645\u0631\u062d\u0644\u0647 \u0628\u0647 \u0645\u0631\u062d\u0644\u0647 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/li>\n<\/ol>\n<p><strong><code>EventExportDto.cs<\/code>:<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"k\">namespace<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Application.Features.Events.Queries.GetEventsExport<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">EventExportDto<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">public<\/span> <span class=\"n\">Guid<\/span> <span class=\"n\">EventId<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n        <span class=\"k\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"p\">=<\/span> <span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"n\">Empty<\/span><span class=\"p\">;<\/span>\n        <span class=\"k\">public<\/span> <span class=\"n\">DateTime<\/span> <span class=\"n\">Date<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong><code>EventExportFileVm.cs<\/code>:<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"k\">namespace<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Application.Features.Events.Queries.GetEventsExport<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">EventExportFileVm<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">EventExportFileName<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"p\">=<\/span> <span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"n\">Empty<\/span><span class=\"p\">;<\/span>\n        <span class=\"k\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">ContentType<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span> <span class=\"p\">=<\/span> <span class=\"kt\">string<\/span><span class=\"p\">.<\/span><span class=\"n\">Empty<\/span><span class=\"p\">;<\/span>\n        <span class=\"k\">public<\/span> <span class=\"kt\">byte<\/span><span class=\"p\">[]?<\/span> <span class=\"n\">Data<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong><code>GetEventsExportQuery.cs<\/code>:<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"k\">using<\/span> <span class=\"nn\">MediatR<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">namespace<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Application.Features.Events.Queries.GetEventsExport<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">GetEventsExportQuery<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IRequest<\/span><span class=\"p\"><span class=\"n\">EventExportFileVm<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">{<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><strong><code>GetEventsExportQueryHandler.cs<\/code>:<\/strong><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"k\">using<\/span> <span class=\"nn\">MediatR<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">AutoMapper<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Application.Contracts.Infrastructure<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Domain.Entities<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">namespace<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Application.Features.Events.Queries.GetEventsExport<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">GetEventsExportQueryHandler<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IRequestHandler<\/span><span class=\"p\"><span class=\"n\">GetEventsExportQuery<\/span><span class=\"p\">,<\/span> <span class=\"n\">EventExportFileVm<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">IAsyncRepository<\/span><span class=\"p\"><span class=\"n\">Event<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_eventRepository<\/span><span class=\"p\">;<\/span>\n        <span class=\"k\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">IMapper<\/span> <span class=\"n\">_mapper<\/span><span class=\"p\">;<\/span>\n        <span class=\"k\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">ICsvExporter<\/span> <span class=\"n\">_csvExporter<\/span><span class=\"p\">;<\/span>\n\n        <span class=\"k\">public<\/span> <span class=\"nf\">GetEventsExportQueryHandler<\/span><span class=\"p\">(<\/span><span class=\"n\">IMapper<\/span> <span class=\"n\">mapper<\/span><span class=\"p\">,<\/span> <span class=\"n\">IAsyncRepository<\/span><span class=\"p\"><span class=\"n\">Event<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">eventRepository<\/span><span class=\"p\">,<\/span> <span class=\"n\">ICsvExporter<\/span> <span class=\"n\">csvExporter<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"n\">_mapper<\/span> <span class=\"p\">=<\/span> <span class=\"n\">mapper<\/span><span class=\"p\">;<\/span>\n            <span class=\"n\">_eventRepository<\/span> <span class=\"p\">=<\/span> <span class=\"n\">eventRepository<\/span><span class=\"p\">;<\/span>\n            <span class=\"n\">_csvExporter<\/span> <span class=\"p\">=<\/span> <span class=\"n\">csvExporter<\/span><span class=\"p\">;<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"k\">public<\/span> <span class=\"k\">async<\/span> <span class=\"n\">Task<\/span><span class=\"p\"><span class=\"n\">EventExportFileVm<\/span><span class=\"p\">&gt;<\/span> <span class=\"nf\">Handle<\/span><span class=\"p\">(<\/span><span class=\"n\">GetEventsExportQuery<\/span> <span class=\"n\">request<\/span><span class=\"p\">,<\/span> <span class=\"n\">CancellationToken<\/span> <span class=\"n\">cancellationToken<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"kt\">var<\/span> <span class=\"n\">allEvents<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_mapper<\/span><span class=\"p\">.<\/span><span class=\"n\">Map<\/span><span class=\"p\"><span class=\"n\">List<\/span><span class=\"p\"><span class=\"n\">EventExportDto<\/span><span class=\"p\">&gt;&gt;((<\/span><span class=\"k\">await<\/span> <span class=\"n\">_eventRepository<\/span><span class=\"p\">.<\/span><span class=\"nf\">ListAllAsync<\/span><span class=\"p\">()).<\/span><span class=\"nf\">OrderBy<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"n\">Date<\/span><span class=\"p\">));<\/span>\n            <span class=\"kt\">var<\/span> <span class=\"n\">fileData<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_csvExporter<\/span><span class=\"p\">.<\/span><span class=\"nf\">ExportEventsToCsv<\/span><span class=\"p\">(<\/span><span class=\"n\">allEvents<\/span><span class=\"p\">);<\/span>\n\n            <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"n\">EventExportFileVm<\/span>\n            <span class=\"p\">{<\/span>\n                <span class=\"n\">ContentType<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"text\/csv\"<\/span><span class=\"p\">,<\/span>\n                <span class=\"n\">Data<\/span> <span class=\"p\">=<\/span> <span class=\"n\">fileData<\/span><span class=\"p\">,<\/span>\n                <span class=\"n\">EventExportFileName<\/span> <span class=\"p\">=<\/span> <span class=\"s\">$\"<\/span><span class=\"p\">{<\/span><span class=\"n\">Guid<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewGuid<\/span><span class=\"p\">()}<\/span><span class=\"s\">.csv\"<\/span>\n            <span class=\"p\">};<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/span><\/span><\/span><\/span><\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<hr\/>\n<h3><span class=\"ez-toc-section\" id=\"3_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D8%B9%D9%85%D9%84%DA%A9%D8%B1%D8%AF_%D8%A7%DB%8C%D9%85%DB%8C%D9%84_%D8%A8%D8%A7_%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87_%D8%A7%D8%B2_SendGrid\"><\/span>\n<p>  <strong>3. \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0639\u0645\u0644\u06a9\u0631\u062f \u0627\u06cc\u0645\u06cc\u0644 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 SendGrid<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0639\u062f\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0642\u0627\u0628\u0644\u06cc\u062a \u0627\u06cc\u0645\u06cc\u0644 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645 <strong>SendGrid<\/strong>.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_31_%D9%82%D8%B1%D8%A7%D8%B1%D8%AF%D8%A7%D8%AF_%D8%AE%D8%AF%D9%85%D8%A7%D8%AA_%D8%A7%DB%8C%D9%85%DB%8C%D9%84_%D8%B1%D8%A7_%D8%AA%D8%B9%D8%B1%DB%8C%D9%81_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  <strong>\u0645\u0631\u062d\u0644\u0647 3.1: \u0642\u0631\u0627\u0631\u062f\u0627\u062f \u062e\u062f\u0645\u0627\u062a \u0627\u06cc\u0645\u06cc\u0644 \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u062f<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ol>\n<li>\u062f\u0631 <strong>\u0644\u0627\u06cc\u0647 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc<\/strong>\u060c \u067e\u06cc\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f \u0628\u0647 <code>Contracts\/Infrastructure<\/code>.<\/li>\n<li>\u06cc\u06a9 \u0631\u0627\u0628\u0637 \u062c\u062f\u06cc\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>IEmailService.cs<\/code>:\n<\/li>\n<\/ol>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"k\">namespace<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Application.Contracts.Infrastructure<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">interface<\/span> <span class=\"nc\">IEmailService<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"n\">Task<\/span><span class=\"p\"><span class=\"kt\">bool<\/span><span class=\"p\">&gt;<\/span> <span class=\"nf\">SendEmail<\/span><span class=\"p\">(<\/span><span class=\"n\">Email<\/span> <span class=\"n\">email<\/span><span class=\"p\">);<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h4><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_32_%D8%B3%D8%B1%D9%88%DB%8C%D8%B3_%D8%A7%DB%8C%D9%85%DB%8C%D9%84_%D8%B1%D8%A7_%D8%AF%D8%B1_%D9%84%D8%A7%DB%8C%D9%87_%D8%B2%DB%8C%D8%B1%D8%B3%D8%A7%D8%AE%D8%AA_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  <strong>\u0645\u0631\u062d\u0644\u0647 3.2: \u0633\u0631\u0648\u06cc\u0633 \u0627\u06cc\u0645\u06cc\u0644 \u0631\u0627 \u062f\u0631 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ol>\n<li>\u062f\u0631 <strong>\u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/strong> \u067e\u0631\u0648\u0698\u0647\u060c \u06cc\u06a9 \u067e\u0648\u0634\u0647 \u0628\u0647 \u0646\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f <code>Mail<\/code>.<\/li>\n<li>\u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u062c\u062f\u06cc\u062f \u0628\u0647 \u0646\u0627\u0645 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>EmailService.cs<\/code>:<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnc6f8ggc0hfh0p2yowga.png\" alt=\"\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"408\" height=\"124\" title=\"\"><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"k\">using<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Application.Contracts.Infrastructure<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Application.Models.Mail<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">Microsoft.Extensions.Options<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">SendGrid<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">SendGrid.Helpers.Mail<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">Microsoft.Extensions.Logging<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">namespace<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Infrastructure.Mail<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">EmailService<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IEmailService<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">EmailSettings<\/span> <span class=\"n\">_emailSettings<\/span><span class=\"p\">;<\/span>\n        <span class=\"k\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">ILogger<\/span><span class=\"p\"><span class=\"n\">EmailService<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">_logger<\/span><span class=\"p\">;<\/span>\n\n        <span class=\"k\">public<\/span> <span class=\"nf\">EmailService<\/span><span class=\"p\">(<\/span><span class=\"n\">IOptions<\/span><span class=\"p\"><span class=\"n\">EmailSettings<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">mailSettings<\/span><span class=\"p\">,<\/span> <span class=\"n\">ILogger<\/span><span class=\"p\"><span class=\"n\">EmailService<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">logger<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"n\">_emailSettings<\/span> <span class=\"p\">=<\/span> <span class=\"n\">mailSettings<\/span><span class=\"p\">.<\/span><span class=\"n\">Value<\/span><span class=\"p\">;<\/span>\n            <span class=\"n\">_logger<\/span> <span class=\"p\">=<\/span> <span class=\"n\">logger<\/span><span class=\"p\">;<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"k\">public<\/span> <span class=\"k\">async<\/span> <span class=\"n\">Task<\/span><span class=\"p\"><span class=\"kt\">bool<\/span><span class=\"p\">&gt;<\/span> <span class=\"nf\">SendEmail<\/span><span class=\"p\">(<\/span><span class=\"n\">Email<\/span> <span class=\"n\">email<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"kt\">var<\/span> <span class=\"n\">client<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">SendGridClient<\/span><span class=\"p\">(<\/span><span class=\"n\">_emailSettings<\/span><span class=\"p\">.<\/span><span class=\"n\">ApiKey<\/span><span class=\"p\">);<\/span>\n            <span class=\"kt\">var<\/span> <span class=\"n\">sendGridMessage<\/span> <span class=\"p\">=<\/span> <span class=\"n\">MailHelper<\/span><span class=\"p\">.<\/span><span class=\"nf\">CreateSingleEmail<\/span><span class=\"p\">(<\/span>\n                <span class=\"k\">new<\/span> <span class=\"nf\">EmailAddress<\/span><span class=\"p\">(<\/span><span class=\"n\">_emailSettings<\/span><span class=\"p\">.<\/span><span class=\"n\">FromAddress<\/span><span class=\"p\">,<\/span> <span class=\"n\">_emailSettings<\/span><span class=\"p\">.<\/span><span class=\"n\">FromName<\/span><span class=\"p\">),<\/span>\n                <span class=\"k\">new<\/span> <span class=\"nf\">EmailAddress<\/span><span class=\"p\">(<\/span><span class=\"n\">email<\/span><span class=\"p\">.<\/span><span class=\"n\">To<\/span><span class=\"p\">),<\/span>\n                <span class=\"n\">email<\/span><span class=\"p\">.<\/span><span class=\"n\">Subject<\/span><span class=\"p\">,<\/span>\n                <span class=\"n\">email<\/span><span class=\"p\">.<\/span><span class=\"n\">Body<\/span><span class=\"p\">,<\/span>\n                <span class=\"n\">email<\/span><span class=\"p\">.<\/span><span class=\"n\">Body<\/span><span class=\"p\">);<\/span>\n\n            <span class=\"kt\">var<\/span> <span class=\"n\">response<\/span> <span class=\"p\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">client<\/span><span class=\"p\">.<\/span><span class=\"nf\">SendEmailAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">sendGridMessage<\/span><span class=\"p\">);<\/span>\n\n            <span class=\"n\">_logger<\/span><span class=\"p\">.<\/span><span class=\"nf\">LogInformation<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Email sent\"<\/span><span class=\"p\">);<\/span>\n\n            <span class=\"k\">return<\/span> <span class=\"n\">response<\/span><span class=\"p\">.<\/span><span class=\"n\">StatusCode<\/span> <span class=\"p\">==<\/span> <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"n\">Net<\/span><span class=\"p\">.<\/span><span class=\"n\">HttpStatusCode<\/span><span class=\"p\">.<\/span><span class=\"n\">Accepted<\/span> <span class=\"p\">||<\/span> <span class=\"n\">response<\/span><span class=\"p\">.<\/span><span class=\"n\">StatusCode<\/span> <span class=\"p\">==<\/span> <span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"n\">Net<\/span><span class=\"p\">.<\/span><span class=\"n\">HttpStatusCode<\/span><span class=\"p\">.<\/span><span class=\"n\">OK<\/span><span class=\"p\">;<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/span><\/span><\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h4><span class=\"ez-toc-section\" id=\"%D9%85%D8%B1%D8%AD%D9%84%D9%87_33_%D8%A7%D8%B1%D8%B3%D8%A7%D9%84_%D8%A7%DB%8C%D9%85%DB%8C%D9%84_%D8%A7%D8%B2_%D9%84%D8%A7%DB%8C%D9%87_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87\"><\/span>\n<p>  <strong>\u0645\u0631\u062d\u0644\u0647 3.3: \u0627\u0631\u0633\u0627\u0644 \u0627\u06cc\u0645\u06cc\u0644 \u0627\u0632 \u0644\u0627\u06cc\u0647 \u0628\u0631\u0646\u0627\u0645\u0647<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>\u062d\u0627\u0644\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0627\u0632 <code>IEmailService<\/code> \u062f\u0631 <code>CreateEventCommandHandler<\/code> \u0628\u0631\u0627\u06cc \u0627\u0631\u0633\u0627\u0644 \u0627\u06cc\u0645\u06cc\u0644 \u0647\u0646\u06af\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0631\u0648\u06cc\u062f\u0627\u062f.<\/p>\n<ol>\n<li>\u062d\u0631\u06a9\u062a \u0628\u0647 <code>Features\/Events\/Commands\/CreateEvent<\/code>.<\/li>\n<li>\u0628\u0627\u0632 \u06a9\u0646\u06cc\u062f <code>CreateEventCommandHandler.cs<\/code> \u0648 \u06a9\u062f \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f:<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7368oe58ym086uvlcxy4.png\" alt=\"\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"552\" height=\"260\" title=\"\"><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"k\">using<\/span> <span class=\"nn\">AutoMapper<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Application.Contracts.Infrastructure<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Application.Contracts.Persistence<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Application.Models.Mail<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Domain.Entities<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">using<\/span> <span class=\"nn\">MediatR<\/span><span class=\"p\">;<\/span>\n\n<span class=\"k\">namespace<\/span> <span class=\"nn\">GloboTicket.TicketManagement.Application.Features.Events.Commands.CreateEvent<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">CreateEventCommandHandler<\/span> <span class=\"p\">:<\/span> <span class=\"n\">IRequestHandler<\/span><span class=\"p\"><span class=\"n\">CreateEventCommand<\/span><span class=\"p\">,<\/span> <span class=\"n\">Guid<\/span><span class=\"p\">&gt;<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">IEventRepository<\/span> <span class=\"n\">_eventRepository<\/span><span class=\"p\">;<\/span>\n        <span class=\"k\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">IMapper<\/span> <span class=\"n\">_mapper<\/span><span class=\"p\">;<\/span>\n        <span class=\"k\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">IEmailService<\/span> <span class=\"n\">_emailService<\/span><span class=\"p\">;<\/span>\n\n        <span class=\"k\">public<\/span> <span class=\"nf\">CreateEventCommandHandler<\/span><span class=\"p\">(<\/span><span class=\"n\">IMapper<\/span> <span class=\"n\">mapper<\/span><span class=\"p\">,<\/span> <span class=\"n\">IEventRepository<\/span> <span class=\"n\">eventRepository<\/span><span class=\"p\">,<\/span> <span class=\"n\">IEmailService<\/span> <span class=\"n\">emailService<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"n\">_mapper<\/span> <span class=\"p\">=<\/span> <span class=\"n\">mapper<\/span><span class=\"p\">;<\/span>\n            <span class=\"n\">_eventRepository<\/span> <span class=\"p\">=<\/span> <span class=\"n\">eventRepository<\/span><span class=\"p\">;<\/span>\n            <span class=\"n\">_emailService<\/span> <span class=\"p\">=<\/span> <span class=\"n\">emailService<\/span><span class=\"p\">;<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"k\">public<\/span> <span class=\"k\">async<\/span> <span class=\"n\">Task<\/span><span class=\"p\"><span class=\"n\">Guid<\/span><span class=\"p\">&gt;<\/span> <span class=\"nf\">Handle<\/span><span class=\"p\">(<\/span><span class=\"n\">CreateEventCommand<\/span> <span class=\"n\">request<\/span><span class=\"p\">,<\/span> <span class=\"n\">CancellationToken<\/span> <span class=\"n\">cancellationToken<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"kt\">var<\/span> <span class=\"n\">@event<\/span> <span class=\"p\">=<\/span> <span class=\"n\">_mapper<\/span><span class=\"p\">.<\/span><span class=\"n\">Map<\/span><span class=\"p\"><span class=\"n\">Event<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">request<\/span><span class=\"p\">);<\/span>\n\n            <span class=\"kt\">var<\/span> <span class=\"n\">validator<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">CreateEventCommandValidator<\/span><span class=\"p\">(<\/span><span class=\"n\">_eventRepository<\/span><span class=\"p\">);<\/span>\n            <span class=\"kt\">var<\/span> <span class=\"n\">validationResult<\/span> <span class=\"p\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">validator<\/span><span class=\"p\">.<\/span><span class=\"nf\">ValidateAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"p\">);<\/span>\n\n            <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">validationResult<\/span><span class=\"p\">.<\/span><span class=\"n\">Errors<\/span><span class=\"p\">.<\/span><span class=\"n\">Count<\/span> <span class=\"p\">&gt;<\/span> <span class=\"m\">0<\/span><span class=\"p\">)<\/span>\n                <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Exceptions<\/span><span class=\"p\">.<\/span><span class=\"nf\">ValidationException<\/span><span class=\"p\">(<\/span><span class=\"n\">validationResult<\/span><span class=\"p\">);<\/span>\n\n            <span class=\"n\">@event<\/span> <span class=\"p\">=<\/span> <span class=\"k\">await<\/span> <span class=\"n\">_eventRepository<\/span><span class=\"p\">.<\/span><span class=\"nf\">AddAsync<\/span><span class=\"p\">(<\/span><span class=\"n\">@event<\/span><span class=\"p\">);<\/span>\n\n            <span class=\"c1\">\/\/ Sending email notification to admin<\/span>\n            <span class=\"kt\">var<\/span> <span class=\"n\">email<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Email<\/span>\n            <span class=\"p\">{<\/span>\n                <span class=\"n\">To<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"admin@example.com\"<\/span><span class=\"p\">,<\/span>\n                <span class=\"n\">Subject<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"A new event was created\"<\/span><span class=\"p\">,<\/span>\n                <span class=\"n\">Body<\/span> <span class=\"p\">=<\/span> <span class=\"s\">$\"A new event was created: <\/span><span class=\"p\">{<\/span><span class=\"n\">request<\/span><span class=\"p\">}<\/span><span class=\"s\">\"<\/span>\n            <span class=\"p\">};<\/span>\n\n            <span class=\"k\">try<\/span>\n            <span class=\"p\">{<\/span>\n                <span class=\"k\">await<\/span> <span class=\"n\">_email<\/span>\n\n<span class=\"n\">Service<\/span><span class=\"p\">.<\/span><span class=\"nf\">SendEmail<\/span><span class=\"p\">(<\/span><span class=\"n\">email<\/span><span class=\"p\">);<\/span>\n            <span class=\"p\">}<\/span>\n            <span class=\"k\">catch<\/span> <span class=\"p\">(<\/span><span class=\"n\">Exception<\/span> <span class=\"n\">ex<\/span><span class=\"p\">)<\/span>\n            <span class=\"p\">{<\/span>\n                <span class=\"c1\">\/\/ Log the error and continue<\/span>\n            <span class=\"p\">}<\/span>\n\n            <span class=\"k\">return<\/span> <span class=\"n\">@event<\/span><span class=\"p\">.<\/span><span class=\"n\">EventId<\/span><span class=\"p\">;<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/span><\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<hr\/>\n<h3><span class=\"ez-toc-section\" id=\"4_%D8%AB%D8%A8%D8%AA_%D8%AE%D8%AF%D9%85%D8%A7%D8%AA_%D8%AF%D8%B1_%D8%B8%D8%B1%D9%81_DI\"><\/span>\n<p>  <strong>4. \u062b\u0628\u062a \u062e\u062f\u0645\u0627\u062a \u062f\u0631 \u0638\u0631\u0641 DI<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0631\u0627\u06cc \u062a\u06a9\u0645\u06cc\u0644 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a\u060c \u0628\u0627\u06cc\u062f \u062b\u0628\u062a \u0646\u0627\u0645 \u06a9\u0646\u06cc\u062f <code>EmailService<\/code> \u0648 <code>CsvExporter<\/code> \u062f\u0631 \u0638\u0631\u0641 DI<\/p>\n<ol>\n<li>\u062f\u0631 <strong>\u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/strong> \u067e\u0631\u0648\u0698\u0647\u060c \u062d\u0631\u06a9\u062a \u0628\u0647 <code>InfrastructureServiceRegistration.cs<\/code>:<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhkfdcajv6plup4kn71ob.png\" alt=\"\u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u062a\u0635\u0648\u06cc\u0631\" loading=\"lazy\" width=\"505\" height=\"132\" title=\"\"><\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"k\">public<\/span> <span class=\"k\">static<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">InfrastructureServiceRegistration<\/span>\n<span class=\"p\">{<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">static<\/span> <span class=\"n\">IServiceCollection<\/span> <span class=\"nf\">AddInfrastructureServices<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span> <span class=\"n\">IServiceCollection<\/span> <span class=\"n\">services<\/span><span class=\"p\">,<\/span> <span class=\"n\">IConfiguration<\/span> <span class=\"n\">configuration<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"n\">services<\/span><span class=\"p\">.<\/span><span class=\"n\">Configure<\/span><span class=\"p\"><span class=\"n\">EmailSettings<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">configuration<\/span><span class=\"p\">.<\/span><span class=\"nf\">GetSection<\/span><span class=\"p\">(<\/span><span class=\"s\">\"EmailSettings\"<\/span><span class=\"p\">));<\/span>\n        <span class=\"n\">services<\/span><span class=\"p\">.<\/span><span class=\"n\">AddTransient<\/span><span class=\"p\"><span class=\"n\">IEmailService<\/span><span class=\"p\">,<\/span> <span class=\"n\">EmailService<\/span><span class=\"p\">&gt;();<\/span>\n        <span class=\"n\">services<\/span><span class=\"p\">.<\/span><span class=\"n\">AddTransient<\/span><span class=\"p\"><span class=\"n\">ICsvExporter<\/span><span class=\"p\">,<\/span> <span class=\"n\">CsvExporter<\/span><span class=\"p\">&gt;();<\/span>\n\n        <span class=\"k\">return<\/span> <span class=\"n\">services<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/span><\/span><\/span><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<ol>\n<li>\u062d\u062a\u0645\u0627 \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0631\u0627 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u06a9\u0646\u06cc\u062f <code>Program.cs<\/code> \u067e\u0631\u0648\u0698\u0647 API \u0634\u0645\u0627:\n<\/li>\n<\/ol>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"n\">builder<\/span><span class=\"p\">.<\/span><span class=\"n\">Services<\/span><span class=\"p\">.<\/span><span class=\"nf\">AddInfrastructureServices<\/span><span class=\"p\">(<\/span><span class=\"n\">builder<\/span><span class=\"p\">.<\/span><span class=\"n\">Configuration<\/span><span class=\"p\">);<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<hr\/>\n<h3><span class=\"ez-toc-section\" id=\"%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\"><\/span>\n<p>  <strong>\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc:<\/strong><br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647\u060c \u0645\u0627 \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u06cc\u0645 <strong>\u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/strong> \u0628\u0627 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632:<\/p>\n<ul>\n<li>\n<strong>\u0635\u0627\u062f\u0631\u0627\u062a CSV<\/strong> \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <code>CsvHelper<\/code> \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647<\/li>\n<li>\n<strong>\u0627\u0631\u0633\u0627\u0644 \u0627\u06cc\u0645\u06cc\u0644<\/strong> \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <strong>SendGrid<\/strong> \u062e\u062f\u0645\u0627\u062a<\/li>\n<\/ul>\n<p>\u0628\u0627 \u067e\u0627\u06cc\u0628\u0646\u062f\u06cc \u0628\u0647 \u0627\u0635\u0648\u0644 \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06a9\u060c \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0631\u062f\u06cc\u0645 \u06a9\u0647 \u0647\u0631 \u062f\u0648 <strong>\u0644\u0627\u06cc\u0647 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc<\/strong> \u0648 <strong>\u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a<\/strong> \u062c\u062f\u0627 \u0628\u0627\u0642\u06cc \u0645\u06cc \u0645\u0627\u0646\u062f \u0648 \u0633\u06cc\u0633\u062a\u0645 \u0631\u0627 \u0642\u0627\u0628\u0644 \u0646\u06af\u0647\u062f\u0627\u0631\u06cc \u0648 \u06af\u0633\u062a\u0631\u0634 \u0645\u06cc \u062f\u0647\u062f. <br \/>\u0628\u0631\u0627\u06cc \u06a9\u062f \u0645\u0646\u0628\u0639 \u06a9\u0627\u0645\u0644\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 \u0645\u062e\u0632\u0646 GitHub \u062f\u06cc\u062f\u0646 \u06a9\u0646\u06cc\u062f: https:\/\/github.com\/mohamedtayel1980\/clean-architecture<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u0645\u0642\u062f\u0645\u0647:\u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0628\u0647 \u0633\u0627\u062e\u062a \u0622\u0646 \u0645\u06cc \u067e\u0631\u062f\u0627\u0632\u06cc\u0645 \u0644\u0627\u06cc\u0647 \u0632\u06cc\u0631\u0633\u0627\u062e\u062a \u062f\u0631 \u06cc\u06a9 \u067e\u0631\u0648\u0698\u0647 \u062f\u0627\u062a \u0646\u062a\u060c \u0628\u0627 \u062a\u0645\u0631\u06a9\u0632 \u0628\u0631 \u062f\u0648 \u0639\u0645\u0644\u06a9\u0631\u062f \u06a9\u0644\u06cc\u062f\u06cc: \u0635\u0627\u062f\u0631 \u06a9\u0631\u062f\u0646 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0631\u0648\u06cc\u062f\u0627\u062f \u0628\u0647 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 CSV \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 CsvHelper \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u0631\u0633\u0627\u0644 \u0627\u0639\u0644\u0627\u0646\u200c\u0647\u0627\u06cc \u0627\u06cc\u0645\u06cc\u0644 \u0647\u0646\u06af\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u0631\u0648\u06cc\u062f\u0627\u062f\u0647\u0627\u06cc \u062c\u062f\u06cc\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 SendGrid &hellip;<\/p>\n","protected":false},"author":2,"featured_media":76585,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-76584","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/76584","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=76584"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/76584\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/76585"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=76584"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=76584"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=76584"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}