【问题标题】:My Asp.net core app Event handlers not working我的 Asp.net 核心应用程序事件处理程序不起作用
【发布时间】: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>();

问题是事件会正确引发,但处理程序不执行。我想在启动时实例化我的类的过程存在问题,但不知道如何解决?这个问题的任何解决方案甚至更好的模式?

【问题讨论】:

    标签: c# asp.net-core events dependency-injection onion-architecture


    【解决方案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()。那么你的事件应该被处理。

    【讨论】:

    • 谢谢。你是对的。构建时出现问题。我修复了它,现在它可以正常工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多