簡體   English   中英

收聽 .NET Core Web API 服務中引發的事件

[英]Listening to raised event in .NET Core Web API service

我會保持簡單。 我的 ASP.NET Core WebAPI 項目中有兩個服務。 服務 A 和服務 B。

服務 A 負責在服務 B 引發事件時發送電子郵件。 服務 B 有一個事件處理程序和一個委托,並且事件被正確引發。 但是,當嘗試通過+= EventHandlingMethod()處理事件時,問題出在服務 A 中;

處理程序方法EventHandlingMethod()永遠不會被調用。 我在方法中放置了一個斷點,但它從不觸發,事件發生在方法EventRaised()已從Service B正確調用之后。

是否有可能因為服務 A 在 Startup.cs 中設置為services.AddTransient<IServiceA, ServiceA>(); ?

我提供了一個發布-訂閱模式的簡單示例。 這是同步的,但如果您正在尋找異步版本,您可以使用通道或任何其他消息代理,例如 RabbitMQ / NServiceBus 等。

public class PublishSubscribeMiddleMan: IPubSub
{
    Dictionary<Type, List<ISubscriber>> pubSub = new Dictionary<Type, List<ISubscriber>>();

    public void PublishEvent<Publisher>(Publisher publisher)
    {
        Type t = publisher.GetType();
        if (pubSub.TryGetValue(t, out var subscribers))
        {
            subscribers.ForEach(subscriber => subscriber.EventHandlingMethod()); 
        }
    }

    public void Subscribe<Publisher>(ISubscriber subscriber)
    {
        Type t = typeof(Publisher);
        if (pubSub.TryGetValue(t, out var subscribers))
        {
            subscribers.Add(subscriber);
        }
        else pubSub.Add(t, new List<ISubscriber> { subscriber });
    }
}

public interface ISubscriber
{
    void EventHandlingMethod();
}


public interface IPubSub
{        
    void Subscribe<Publisher>(ISubscriber subscriber);
    void PublishEvent<Publisher>(Publisher publisher);
}

public class ServiceA : IServiceA
{
    private readonly IPubSub publishSubscribe;

    public ServiceA(IPubSub publishSubscribe)
    {
        this.publishSubscribe = publishSubscribe;
    }
    public void RaiseEvent()
    {
        publishSubscribe.PublishEvent(this);
    }
}

public interface IServiceA
{
    void RaiseEvent();
}

public class ServiceB : ISubscriber
{
    public ServiceB(IPubSub publishSubscribe)
    {
        publishSubscribe.Subscribe<ServiceA>(this);
    }
    public void EventHandlingMethod()
    {
        //throw new NotImplementedException();
    }
}

您需要在 ConfigureServices 中注冊 PubSub,如下所示:

services.AddScoped<IPubSub, PublishSubscribeMiddleMan>();
services.AddTransient<IServiceA, ServiceA>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM