【问题标题】:EventHandler ASP.NET CORE事件处理程序 ASP.NET CORE
【发布时间】:2018-06-06 16:56:42
【问题描述】:

我在 ASP.NET CORE 中有一个项目。我想在 ExchangeService 类的 RejectExchange 方法完成之前调用一个方法(将来会调用几个方法)。因此,我阅读了有关 EventHandlers 的信息,但我不知道应该在哪里将方法分配给委托。我有 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();
    }
}

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

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

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

我的问题是我应该在哪里为委托分配方法?对不起我的英语,我希望你能理解我的问题:)

【问题讨论】:

    标签: c# asp.net asp.net-core delegates eventhandler


    【解决方案1】:

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

    对于解决方案,我使用库 Autofac 作为 DI 提供者并配置了我的服务,它通过 Autofac 的 Lifetime 事件公开了一个 EventHandler。

    例子:

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

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

    最好的问候, 丹尼尔

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 2012-04-29
      • 1970-01-01
      • 2018-01-25
      相关资源
      最近更新 更多