Как установить связь между слушателем событий в ASP.NET MVC 5? - PullRequest
0 голосов
/ 18 октября 2018

У меня есть проект, который написан с c# поверх платформы ASP.NET MVC 5.Я настроил IoC, используя Unity-container для обработки инъекций зависимостей.

Мне нужно установить какие-то коммуникационные возможности, где любая часть моего приложения может прослушивать событие, а затем выполнятьспецифическая логика.

Ниже приведен мой первый шаг при создании события / слушателя, но я задаюсь вопросом, является ли это хорошим подходом и есть ли лучший способ создания события / слушателей.

// 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);
                }
            }
        }
    }
}

Вот пример того, как я мог бы использовать приведенный выше код.Предположим, я хочу отправить приветственное электронное письмо и назначить пользователю ориентацию после его создания.

// 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);
    }
}

Вопрос : существует ли лучший подход к созданию события / прослушивателя в ASPПроект .NET MVC 5?Каковы проблемы с вышеупомянутой настройкой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...