Здравсвуйте, нужно реализовать внутрениий EventBus (не микросервисное взаимодействие на основе например RabbitMq). Все издатели пишут на общую шину генерацию события с типизированным данными (MyData) Подписчики слушают шину и фильтруют издателей по типу дачных (MyData). Желательно чтобы при подписке возвращался IDisposable. И издатель мог также отписать всех подписчиков.
Не было времени искать готовые решения поэтому быстро сделал обертку над ReactiveExt
public class ReactiveEventBus
{
public ISubject<object> Bus { get; set; }
public ReactiveEventBus()
{
Bus = new Subject<object>();
}
public void Publish<TMessage>(TMessage msg)
{
Bus.OnNext(msg);
}
public IDisposable Subscribe<TMessage>(Action<TMessage> action)
{
return Bus
.Where(item=> item.GetType() == typeof(TMessage))
.Subscribe((obj) =>
{
var val = (TMessage) obj;
action(val);
});
}
}
Т.е. Subscribe срабатывает на всех Publish, для сработки только на нужных событиях, фильтрую через Where по типу.
Тут есть проблема boxing/unboxing
если TMessage Value типа, т.к. идет преобразование из object ( var val = (TMessage) obj)
перед вызовом самого делегата.
Но у меня события Value врядли будут.
Как сильно сказывается на производительности фильтрация (Where
) в Rx событиях если много подписчиков и часто публикуются события.
Стоит ли это реализацию заменять на готовые решения (первое что попалось MemBus)?
Сама по себе фильтрация на производительности никак не сказывается. Это же просто условный оператор, пусть и в нескольких обертках...
Важно другое: каждое сообщение в такой схеме направляется сразу всем подписчикам, а потом частью отбрасывается. То есть чем больше подписчиков - тем медленнее работа.
Если вы планируете пересылать через такую шину много данных - лучше создать отдельный Subject для каждого типа сообщений.
PS а если вы решите остаться на текущей архитектуре - изучите что делает метод OfType :-)
Виртуальный выделенный сервер (VDS) становится отличным выбором
Нужно сделать проверку что бы введенное слово не содержало английских символов (f,a,g)Но простым, длинным str
Есть класс с одним методом:
Как использовать Scrypt или Bcrypt в C#Прошерстил несколько сайтов и форумов, но не вижу никаких объяснений, как скачать и установить библиотеку...
Сразу говорю, что ответ, скорее всего, лежит у меня перед глазами, но я его, как обычно, не вижу(А ещё, скорее всего, я запутался xD) Есть код, в котором...