我的 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 库的发送和发布方法添加通用处理程序

从控制器重新加载配置(asp.net 核心应用程序)

OnClientClick 自定义消息框之前 Onclick 事件处理程序不起作用

ASP.NET 生命周期,PreRequestHandlerExecute 事件