是否可以在 Asp Net Web Api 控制器中使用事件处理程序?

Myk*_*ych 8 asp.net controller event-handling signalr signalr-hub

我有一个 web api 控制器,我想在其中使用事件处理程序。更具体地说,我有一个MessagesController,当执行 action 方法时,WriteMessage我想触发一个SignalR Hub method将订阅a 的事件,该方法将向所有必要的接收者广播消息。看看下面的简化代码:

这是控制器:

public class MessagesController : ApiController
{
    private readonly IMessageService _messageService;
    public EventHandler<MessageEventArgs> MessageSent;

    public MessagesController(IMessageService messageService)
    {
        _messageService = messageService;
    }

    public IHttpActionResult WriteMessage(Message message)
    {
        try
        {
            //here I'm using MessageService to write the message to the data base
            _messageService.WriteMessage(message);

            //after the message was saved successfully I would like to trigger the event that will fire a signalR hub's method
            OnMessageSent(message);
            return Content(HttpStatusCode.Created, message);
        }
        //some exception handling
        catch (Exception ex)
        {
            ...
        }
    }

    protected void OnMessageSent(Message message)
    {
        if (MessageSent!= null)
            MessageSent(this,new MessageEventArgs{Message = message});
    }
}
Run Code Online (Sandbox Code Playgroud)

这是 SignalR 集线器(这只是一个快速概述,我还没有测试过):

public class MessagesHub : Hub
{
    public static void Send(string message)
    {
        Clients.All.send(message);
    }

    public void OnMessageSent(object source, MessageEventArgs args)
    {
        Send(args.Message.Text);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想以某种方式订阅控制器的事件处理程序。如果是普通课程,我会做这样的事情:

messagesController.MessageSent+=messagesHub.OnMessageSent

由于这是一个控制器,我无法控制它的创建,因此我可能无法执行上述操作。当然,我可以避免使用事件而MessagesHub.Send直接在控制器的方法中调用,但是事件驱动的方法将与SiganlR控制器解耦,总体而言似乎是一个更优雅的解决方案。你能给点建议吗?