上一節有探討 MediatR套件的 IRequest 運作,
一樣於 .Net Core 中實行 MediatR套件的 INotification ,會先註冊此套件:
而 Service.AddMediatR 註冊的過程也於上一節的前半部分介紹過,這邊不在重複。接著觀察 Notification 的運作。
[INotification]
假設我們以執行以下程式碼為例:
await _mediator.Publish(new MessageNotice(customer), new System.Threading.CancellationToken());
而類別繼承了介面 INotification:
public class MessageNotice : INotification
{
public DateTime SubmittedAt { get; set; }
public string FullName { get; set; }
public string EmailAddress { get; set; }
public string Message { get; set; }
public MessageNotice(Customer Customer)
{
FullName = Customer.FirstName + " " + Customer.LastName;
SubmittedAt = DateTime.Now;
EmailAddress = Customer.FirstName + "_" + Customer.LastName + "@mail.com";
Message = " Happy Holiday! ";
}
public MessageNotice()
{
}
}
執行的Handler類別:
public class MailNoticeHandler : INotificationHandler<MessageNotice>
{
public Task Handle(MessageNotice notification, CancellationToken cancellationToken)
{
MailCollection.Instance[MailCollection.Instance.Count] = notification;
return Task.CompletedTask;
}
}
public class QueueNoticeHandler : INotificationHandler<MessageNotice>
{
public Task Handle(MessageNotice notification, CancellationToken cancellationToken)
{
QueueCollection.Instance[QueueCollection.Instance.Count] = notification;
return Task.CompletedTask;
}
}
運作過程如下:
其 MailCollection、QueueCollection 為自己簡化設計的儲存空間,未來可以替換成對Mail資訊 與 對Queue資訊相關的資料庫操作。
透過.net Core 的 DI 機制,可以在controller建構子取到 Mediator,與其中的欄位 ServiceFactory。
之後會用一些處理Type與Instance對應實體的處理。
接著圖中有幾個步驟:
第一,直接新增實例 NotificationHandlerWrapperImpl ,這邊的範例 TNotification 是 INotificationHandler。
第二,將 ServiceFactory 委派為由Dot Net Core 框架中的 IServiceProvider.GetService 經由註冊好的服務產生實例。
然後將 ServiceFactory 與 Mediator.PublishCore 函式傳遞至 NotificationHandlerWrapperImpl.Handle。
第三,利用 ServiceFactory 從已註冊的服務 INotificationHandler 實現實體,這也是由開發者所建立的類別。
第四,執行所有第三中實現的實體中的Handle函示。
以上為INotification運作過程闡述。