【发布时间】: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