Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EventHandler ASP.NET核心_C#_Asp.net_Asp.net Core_Delegates_Eventhandler - Fatal编程技术网

C# EventHandler ASP.NET核心

C# EventHandler ASP.NET核心,c#,asp.net,asp.net-core,delegates,eventhandler,C#,Asp.net,Asp.net Core,Delegates,Eventhandler,我有一个ASP.NET核心的项目。我想在ExchangeService类中的RejectExchange方法完成之前调用一个方法(将来有几个方法)。因此,我阅读了有关EventHandler的内容,但我不知道应该在哪里为委托分配方法。我有ExchangeService类: public class ExchangeService : IExchange { private readonly SocialNetworkContext _context; private readon

我有一个ASP.NET核心的项目。我想在ExchangeService类中的RejectExchange方法完成之前调用一个方法(将来有几个方法)。因此,我阅读了有关EventHandler的内容,但我不知道应该在哪里为委托分配方法。我有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;            
    }
}
一切都很好,但我不明白在哪里必须为委托分配方法。我有一个ExchangeController,在这里我使用依赖项注入,并将IExchangeService传递给构造函数,在那里我分配方法进行委托:

public ExchangeController(IExchange exchangeService, IExchangeRequestNotification exchangeRequestNotification, IChat chatService)
    {
        _exchangeService = exchangeService;
        _exchangeRequestNotificationService = exchangeRequestNotification;
        exchangeService.ExchangeRejecting += _exchangeRequestNotificationService.OnExchangeRejecting;
        exchangeService.ExchangeRejecting += chatService.OnExchangeRejecting;
    }
但我认为这是不对的,因为在这个控制器中,我并不真正需要ExchangeRequestNotificationService和ChatService(它也有方法OneExchangeRejecting),我只需要ExchangeService。ExchangeRequestNotificationService仅在将方法分配给RejectingExchange方法上的委托时传递给控制器,并且在将来情况会更糟(注入更多不需要的服务)


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

我一直在问自己同样的问题,我在stackoverflow上看到了你的帖子。因为我在网上没有找到解决办法,所以我试着自己解决

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

例如:

builder.RegisterType<MyService>().InstancePerRequest().OnActivated(e =>
{
    var dep = e.Context.Resolve<MyEventHandler>();
    e.Instance.EntitySaved += dep.OnEntitySaved;
});
builder.RegisterType().InstancePerRequest().OnActivated(e=>
{
var dep=e.Context.Resolve();
e、 Instance.EntitySaved+=dep.OnEntitySaved;
});
因此,无论我的服务注入到哪里,我都可以保证EventHandler始终被注册。我选择了OnActivated生存期事件而不是OnActivating,以避免循环依赖性问题;e、 g.EventHandler是否应间接使用MyService

致以最良好的祝愿, 丹尼尔

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