如何在ASP.NET MVC 5中建立事件监听器通信?

Jun*_*ior 6 c# asp.net unity-container event-listener asp.net-mvc-5

我有一个用c#ASP.NET MVC 5框架编写的项目.我设置了一个IoC使用Unity容器来处理依赖注入.

我需要建立某种通信功能,我的应用程序的任何部分都可以监听事件然后执行特定的逻辑.

以下是我第一次尝试构建事件/监听器,但想知道这是否是一个好方法,以及是否有更好的方法来创建事件/监听器.

// First we define a base class for the Events
// This allows me tho identify Events. Perhaps this could be changed to interface instead of a base class
public abstract class Event
{

}

// Second we define a base class for our listener
// each listener must provide a an event that it wish to listen to
public abstract class Listener<T> where T : Event
{
    // each listener will add to do logic inside the Handle() method
    public abstract void Handle(T _event);
}

// Here is my announcing service or event dispatcher
// This class announces that an event took place for anyone that cares
public class Announcer : IAnnouncer
{
    private IUnityContainer Container;

    public Announcer(IUnityContainer container)
    {
        Container = container;
    }

    public void Announce<T>(T _event) where T : Event
    {
        // Get all listeners
        var listeners = Container.ResolveAll<Listener<T>>();

        foreach(var listener in listeners)
        {
            // here I may need to add a support to queue up the events or delay dispatching if needed
            try
            {
                listener.Handle(_event);

                if(listener is IHandleSuccess _listener)
                {
                    _listener.Finished(_event, listener);
                }
            }
            catch (Exception e)
            {
                if (listener is IHandleFailed _listener)
                {
                    _listener.Failed(_event, e);
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我将如何使用上述代码的示例.假设我想发送一封欢迎电子邮件,并在创建用户后为用户安排一个方向.

// First, define a simple event called UserWasCreated
public class UserWasCreated : Event
{
    public User User { get; private set; }

    public UserWasCreated(User user)
    {
        User = user;
    }
}

// Listener Example 1, Now we have a listener that would listen for when a user is added 
// This listener would simply send a welcome email to the new user
public class SendWelcomeEmail : Listener<UserWasCreated>
{
    public void Handle(UserWasCreated _event)
    {
        // here we can send an to the event.User....
    }
}

// Listener Example 2, Now we have a listener that would listen for when a user is added 
// This listener would simply sign up the user for an orientation
public class ScheduleOrientation : Listener<UserWasCreated>
{
    public void Handle(UserWasCreated _event)
    {
        // here we can schedule the orientation
    }
}

// In the controller we make announcement that the event took place
public UsersController : Controller
{   
    private IUserMapper UserMapper;
    private IAnnouncer Announcer;
  private IUserService UserService;

    public UsersController(IUserMapper userMapper, IAnnouncer announcer, IUserService userService)
    {
        UserMapper = userMapper;
        Announcer = announcer;
         UserService = userService;
    }

    ...

    [HttpPost, ValidateAntiForgeryToken]
    public ActionResult Create(CreateUserViewModel viewModel)
    {
        if (ModelState.IsValid)
        {
            User user = UserMapper.Map(viewModel);

            UserService.Create(user);

            // Here we announce the the event UserWasCreated took place.
            Announcer.Announce(new UserWasCreated(user));
        }

        return View(viewModel);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:在ASP.NET MVC 5项目中是否有更好的方法来创建事件/侦听器?上述设置有什么问题?