Я удаляю нашу систему электронной почты с нашего сайта ASP.NET, который раньше отправлял электронные письма немедленно с помощью системы для обработки запросов в отдельной службе, чтобы снизить нагрузку на веб-сайт. Я пытаюсь спроектировать его на основе набора интерфейсов, чтобы я мог поменять местами реализации, если захочу, но изначально он будет основан на очереди сообщений (MSMQ) для отправки запросов в очередь, чтобы служба получала входящие запросы а затем обработать их. В настоящее время у меня примерно определены следующие интерфейсы:
// Sends one or more requests to be processed somehow
public interface IRequestSender
{
void Send(IEnumerable<Request> requests);
}
// Listens for incoming requests and passes them to an observer to do the real work
public interface IRequestListener : IObservable<Request>
{
void Start();
void Stop();
}
// Processes a request given to it by a IRequestListener
public interface IRequestProcessor : IObserver<Request>
{
}
Вы заметите, что Listener и Processor используют наблюдаемый шаблон, так как я думаю, что он подходит лучше всего.
Моя проблема заключается в том, чтобы выяснить, как написать реализацию IRequestListener, которая получает от MSMQ, в основном, как мне создать подходящий IObservable<T>?
Мой первый вариант, который я нашел, — создать IObservable<T> с нуля на основе примера, приведенного Документация MSDN, но это похоже на большую работу по сантехнике.
Другим вариантом является использование Reactive Extensions, так как кажется, что они предназначены для упрощения создания наблюдаемых. Наиболее близкими, которые я нашел для использования Rx с MSMQ, являются эти страницы:
- Использование реактивного расширения (Rx) для MSMQ получение сообщения с использованием асинхронного шаблона (queue.BeginReceive,queue.EndReceive)
- MSMQ с использованием Rx — фрагмент кода для проблемы с тайм-аутом получения MSMQ
Но я не знаю, как применить эти примеры к моему интерфейсу IRequestListener.
Любые другие идеи тоже приветствуются, даже изменения в моем базовом дизайне, если они подходят.