[英]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.