我的 Asp.net 核心应用程序事件处理程序不起作用
Posted
技术标签:
【中文标题】我的 Asp.net 核心应用程序事件处理程序不起作用【英文标题】:My Asp.net core app Event handlers not working 【发布时间】:2021-11-05 04:01:08 【问题描述】:我正在使用洋葱架构创建一个 ASP.net Core 应用程序。我想在业务逻辑层中引发一些事件并从基础设施层订阅这些事件。(从内到外的层:域 - 合同 - 业务逻辑 -基础设施 - API)
我的 BL 类和事件实现之一:
public class LiveStreamBusinessLogic : ILiveStreamBusinessLogic
public event ILiveStreamBusinessLogic.LiveStreamEventHandler LiveStreamEventOccured;
public async Task<IBusinessLogicResult<PagedList<LiveStreamForShowDto>>> GetAllLiveStreamAsync(LiveStreamParameters liveStreamParameters)
// some logic
OnDomainEventOccured();
return new BusinessLogicResult<PagedList<LiveStreamForShowDto>>
Success = true, Result = livesListForTransferPaged;
protected virtual void OnDomainEventOccured()
LiveStreamEventOccured?.Invoke(this, EventArgs.Empty);
我也在使用 DI 来创建具有此接口的上层:
public interface ILiveStreamBusinessLogic
public delegate void LiveStreamEventHandler(object sender, EventArgs args);
public event LiveStreamEventHandler LiveStreamEventOccured;
Task<IBusinessLogicResult<PagedList<LiveStreamForShowDto>>> GetAllLiveStreamAsync(LiveStreamParameters liveStreamParameters);
这个类将通过 StartUp 类实例化:
services.AddScoped<ILiveStreamBusinessLogic, LiveStreamBusinessLogic>();
我的订阅者是:
public class ElasticLogger
private readonly ILoggerManager _loggerManager;
private readonly ILiveStreamBusinessLogic _liveStreamBusinessLogic;
public ElasticLogger(ILoggerManager loggerManager, ILiveStreamBusinessLogic liveStreamBusinessLogic)
_loggerManager = loggerManager;
_liveStreamBusinessLogic = liveStreamBusinessLogic;
Subscribe();
private void Subscribe()
_liveStreamBusinessLogic.LiveStreamEventOccured += OnDomainEventOccured;
private void OnDomainEventOccured(object sender, EventArgs e)
_loggerManager.LogInfo(Serialize(e).ToString());
和启动:
services.AddScoped<ElasticLogger>();
问题是事件会正确引发,但处理程序不执行。我想在启动时实例化我的类的过程存在问题,但不知道如何解决?这个问题的任何解决方案甚至更好的模式?
【问题讨论】:
【参考方案1】:通过查看您的示例代码,我看不出您正在创建ElasticLogger
的实例。这意味着没有创建ElasticLogger
,因此它不能创建Subscribe
。
您可以通过在ElasticLogger
的构造函数中放置一个断点来检查我的理论是否正确。如果你从来没有遇到断点,那我是对的。
我建议你重构ElasticLogger
,不要从构造函数中调用Subscribe
。但是这样做:
public class ElasticLogger
private readonly ILoggerManager _loggerManager;
private readonly ILiveStreamBusinessLogic _liveStreamBusinessLogic;
public ElasticLogger(ILoggerManager loggerManager, ILiveStreamBusinessLogic liveStreamBusinessLogic)
_loggerManager = loggerManager;
_liveStreamBusinessLogic = liveStreamBusinessLogic;
public void Subscribe()
_liveStreamBusinessLogic.LiveStreamEventOccured += OnDomainEventOccured;
private void OnDomainEventOccured(object sender, EventArgs e)
_loggerManager.LogInfo(Serialize(e).ToString());
但是,请确保您在外部调用它,在您的应用程序启动后,在外部调用它:elasticLogger.Subscribe()
。那么你的事件应该被处理。
【讨论】:
谢谢。你是对的。构建时出现问题。我修复了它,现在它可以正常工作了。以上是关于我的 Asp.net 核心应用程序事件处理程序不起作用的主要内容,如果未能解决你的问题,请参考以下文章
使用单个事件处理程序 asp.net 从网格中处理多个删除事件
使用中间件的全局异常处理在 ASP.Net Core 应用程序中不起作用
在 asp .net 核心中为 MediatR 库的发送和发布方法添加通用处理程序