Есть ли лучшая практика для прикрепления уведомлений по электронной почте к некоторым методам без редактирования внутреннего кода методов? - PullRequest
1 голос
/ 30 июля 2011

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

Есть ли стандартный хороший способ прикрепить уведомление к какому-либо методу без изменения кода метода?

Например, я подумал, можно ли добавить атрибут к методу, этот атрибут заставит этот метод вызывать уведомлениемодуль с некоторыми параметрами.

примечание: я работаю над веб-сайтом ASP.Net MVC 3, используя codefirst структуры сущностей.

Ответы [ 3 ]

1 голос
/ 30 июля 2011

Я не верю, что существует стандартный процесс.

Аспектно-ориентированные подходы (например, атрибуты) могут быть полезны, только если они используются в сочетании с инфраструктурами AOP (такими как AspectSharp ) или при использовании в самом действии MVC: вы можете использовать Фильтры действий для выполнения требования и отправки используют уведомление , если события сопоставлены с действиями MVC .

0 голосов
/ 30 июля 2011

Было бы довольно сложно без каких-либо изменений в исходном коде. Как бы вы узнали, что действие прошло успешно? И какой тип уведомления должен быть отправлен, кому и т. Д.

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

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

IMO было бы лучше, если бы вы интегрировали отправку уведомлений в существующий код. Если вы расширяете значение хранилища (и используете его), чтобы «выполнять действия с базой данных и все остальное, связанное с созданием / обновлением / удалением объекта». Никаких изменений в действиях контроллера, и ваши методы EventRepository.Create / Modify будут знать, что уже имеют все параметры для отправки уведомлений ...

0 голосов
/ 30 июля 2011

Слушатели событий.Вам действительно нужно изменить код, но вы на самом деле не отправляете электронное письмо внутри кода.

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

В псевдо-Java:

public class OrderProcessor {
  protected final List<OrderProcessorListener> listeners = new ArrayList<OrderProcessorListener>();

  public void addListener(OrderProcessorListener orderProcessorListener) {
    listeners.add(orderProcessorListener);
  }

  public void notifyListeners(OrderProcessorEvent event) {
    for(OrderProcessorListener listener : listeners) {
      listener.handle(event);
    }
  }

  public void randomMethod() {
    // ... do stuff
    notifyListeners(new SomeEvent(...)); // notify listeners
  }

  public interface OrderProcessorListener {
    public void handle(OrderProcessorEvent event);
  }
}

тогда другой заинтересованный код может сделать ...

public class EmailSender implements OrderProcessorListener {
  public void handleEvent(OrderProcessorEvent event) {
    // do whatever...
  }
}

Когда вы создаете свой OrderProcessor иВаш EmailSender, затем вы добавляете EmailSender в качестве слушателя и вуаля.Вы можете использовать этот шаблон везде, где вам нужно реагировать на действия из фрагмента кода, и вам не нужно помещать действия в один и тот же код ...

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