gpt4 book ai didi

c# - 事件处理器 ASP.NET CORE

转载 作者:行者123 更新时间:2023-12-05 07:38:21 27 4
gpt4 key购买 nike

我在 ASP.NET CORE 中有一个项目。我想在 ExchangeService 类的 RejectExchange 方法完成之前调用一个方法(将来有几种方法)。所以我阅读了 EventHandlers 来做到这一点,但我不知道应该在哪里将方法分配给委托(delegate)。我有 ExchangeService 类:

public class ExchangeService : IExchange
{
private readonly SocialNetworkContext _context;
private readonly IUser _userService;
private readonly IItem _itemService;
private readonly IExchangeRequestNotification _exchangeRequestNotificationService;

public event EventHandler<Exchange> ExchangeRejecting;

protected virtual void OnExchangeRejecting(Exchange exchange)
{
ExchangeRejecting?.Invoke(this, exchange);
}

public void RejectExchange(int id)
{
var exchange = GetById(id);

OnExchangeRejecting(exchange);

Delete(exchange);
}

public ExchangeService(SocialNetworkContext context, IUser userService, IItem itemService, IExchangeRequestNotification exchangeRequestNotificationService)
{
_context = context;
_userService = userService;
_itemService = itemService;
_exchangeRequestNotificationService = exchangeRequestNotificationService;
}
}

我想删除关于交换的通知,在交换被删除之前,在 ExchangeRequestNorificationService 中,所以我创建了方法 OnExchangeRejecting:

public class ExchangeRequestNotificationService : IExchangeRequestNotification
{
private readonly SocialNetworkContext _context;
private readonly IUser _userService;

public ExchangeRequestNotificationService(SocialNetworkContext context, IUser userService)
{
_context = context;
_userService = userService;
}

public void OnExchangeRejecting(object source, Exchange exchange) => Delete(GetByExchangeId(exchange.Id));

public void Delete(ExchangeRequestNotification exchangeRequestNotification)
{
_context.Remove(exchangeRequestNotification);
_context.SaveChanges();
}
}

一切都很好,但我不明白我必须在哪里将方法分配给委托(delegate)。我有 ExchangeController,我在其中使用依赖项注入(inject)并将 IExchangeService 传递给构造函数,然后我将方法分配给委托(delegate):

public ExchangeController(IExchange exchangeService, IExchangeRequestNotification exchangeRequestNotification, IChat chatService)
{
_exchangeService = exchangeService;
_exchangeRequestNotificationService = exchangeRequestNotification;
exchangeService.ExchangeRejecting += _exchangeRequestNotificationService.OnExchangeRejecting;
exchangeService.ExchangeRejecting += chatService.OnExchangeRejecting;
}

但我觉得不对,因为在这个controller中我真的不需要ExchangeRequestNotificationService和ChatService(它也有方法OnExchangeRejecting),我只需要ExchangeService。 ExchangeRequestNotificationService 仅传递给 Controller ​​以将方法分配给方法 OnRejectingExchange 上的委托(delegate),并且在未来它会更糟(注入(inject)更多不需要的服务)。

我的问题是我应该在哪里明确地将方法分配给委托(delegate)?对不起我的英语,我希望你能理解我的问题:)

最佳答案

我一直在问自己同样的问题,并且看到了您关于 stackoverflow 的帖子。由于在网上没有找到解决方案,我尝试自己解决。

对于该解决方案,我使用库 Autofac 作为 DI 提供程序并配置了我的服务,它通过 Autofac 的生命周期事件公开了一个 EventHandler。

例子:

builder.RegisterType<MyService>().InstancePerRequest().OnActivated(e =>
{
var dep = e.Context.Resolve<MyEventHandler>();
e.Instance.EntitySaved += dep.OnEntitySaved;
});

所以我可以保证无论我的服务注入(inject)到哪里,EventHandler 总是被注册。我选择了 OnActivated 生命周期事件而不是 OnActivating 以避免循环依赖问题;例如如果 MyService 应该由 EventHandler 间接使用。

最好的问候,丹尼尔

关于c# - 事件处理器 ASP.NET CORE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47968587/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com