Шина сообщений
От: Somescout  
Дата: 02.10.19 07:09
Оценка:
А есть на .net какая-нибудь библиотека для реализации шины сообщений внутри приложения (т.е. чтобы можно было отправить сообщение и его поймали все подписавшиеся, аналог sobjectizer)? В принципе нетрудно и самому сделать, но не хотелось бы пилить свой велосипед.

ЗЫ. Желательно что-то простое и удобное.
ARI ARI ARI... Arrivederci!
Re: Шина сообщений
От: MadHuman Россия  
Дата: 02.10.19 07:18
Оценка:
Здравствуйте, Somescout, Вы писали:

S>А есть на .net какая-нибудь библиотека для реализации шины сообщений внутри приложения (т.е. чтобы можно было отправить сообщение и его поймали все подписавшиеся, аналог sobjectizer)? В принципе нетрудно и самому сделать, но не хотелось бы пилить свой велосипед.


S>ЗЫ. Желательно что-то простое и удобное.

а чем штатный event не подходит?
Re[2]: Шина сообщений
От: Somescout  
Дата: 02.10.19 08:47
Оценка:
Здравствуйте, MadHuman, Вы писали:


S>>ЗЫ. Желательно что-то простое и удобное.

MH>а чем штатный event не подходит?

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


class SomeClass1 {
    private readonly IMessageBus messageBus;

    public SomeClass1(IMessageBus messageBus) {
        this.messageBus = messageBus;

        messageBus.Subscribe<SetPageTitleEvent>(SetPageTitle);
    }

    private void SetPageTitle(SetPageTitleEvent evt) {
        ...
    }
}

class SomeOtherClass1 {
    private readonly IMessageBus messageBus;

    public SomeOtherClass1(IMessageBus messageBus) {
        this.messageBus = messageBus;
    }

    public void SomeAction() {
        messageBus.Send(new SetPageTitleEvent {
            Title = "Test title"
        });
    }
}


То есть отправитель пуляет сообщение, а кто его получит и что с ним сделает его не волнует.
ARI ARI ARI... Arrivederci!
Отредактировано 02.10.2019 8:48 Somescout . Предыдущая версия .
Re: Шина сообщений
От: Danchik Украина  
Дата: 02.10.19 09:04
Оценка: 5 (1) +4
Здравствуйте, Somescout, Вы писали:

S>А есть на .net какая-нибудь библиотека для реализации шины сообщений внутри приложения (т.е. чтобы можно было отправить сообщение и его поймали все подписавшиеся, аналог sobjectizer)? В принципе нетрудно и самому сделать, но не хотелось бы пилить свой велосипед.


S>ЗЫ. Желательно что-то простое и удобное.


Так Reactive Extensions же.

private Subject<Message> _subject = new Subject<Message>();
public IObservable<Message> Messages => _subject.AsObservable();
public void PostMessage(Message m) => _subject.OnNext(m);

// подписаться
var subscription = Messages.Subscribe(m => Console.WriteLine(m));

...
// отписываться тоже иногда надо
subscrption.Dispose()
Re: Шина сообщений
От: TG  
Дата: 02.10.19 09:05
Оценка: 6 (1)
Здравствуйте, Somescout, Вы писали:

S>А есть на .net какая-нибудь библиотека для реализации шины сообщений внутри приложения (т.е. чтобы можно было отправить сообщение и его поймали все подписавшиеся, аналог sobjectizer)? В принципе нетрудно и самому сделать, но не хотелось бы пилить свой велосипед.


S>ЗЫ. Желательно что-то простое и удобное.


Гуглите по словам Event Aggregator.
Re: Шина сообщений
От: RushDevion Россия  
Дата: 02.10.19 09:09
Оценка: 5 (1) +1 -1
S>ЗЫ. Желательно что-то простое и удобное.

Имхо, проще самому написать.
Вот как пример глянь.
Старая наработка, но вроде примерно то, что тебе нужно.
Если надо, чтобы паблишер не блокировался — вынести dispatch по подписчикам в отдельный тред.
DataBus
Re: Шина сообщений
От: 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ൒  
Дата: 02.10.19 14:56
Оценка: -1
Писаться отписаться, реактив шреактив — в классы, нуждающиеся в оповещениях, инжектить или любым другим способом пробрасывать синглтон PubSub'a — с одним методом Publish({from, to, message}) и одним событием Subscribe({from, to, message}). В тех же классах реализовать Dispose, удаляющий подписку на Subscribe событие, если создаются/удляются инстансы класса. При большом количестве подписчиков (например, айтемы в листе) — использовать проксированный PabSub в комбинации с обзервабл коллекцией (например). Для таких фигни точно не стоит тащить что то тяжелое. Другое дело, если уже подсели на какой нибудь призм — тогда надо смотреть что там есть ЕА в призме, как пример.
Re: Не тащите сишные паттерны/навыки в прекрасный .net ;)
От: VladCore  
Дата: 03.10.19 01:38
Оценка:
Здравствуйте, Somescout, Вы писали:

S>А есть на .net какая-нибудь библиотека для реализации шины сообщений внутри приложения (т.е. чтобы можно было отправить сообщение и его поймали все подписавшиеся, аналог sobjectizer)? В принципе нетрудно и самому сделать, но не хотелось бы пилить свой велосипед.


S>ЗЫ. Желательно что-то простое и удобное.


Задачу опиши. То, что в sobjectizer называется диспетчер, в .net является TaskScheduler. Тебе же надо что бы можно было управлять в одном потоке подписчики работали или в разных?
Отредактировано 03.10.2019 1:48 VladCore . Предыдущая версия . Еще …
Отредактировано 03.10.2019 1:42 VladCore . Предыдущая версия .
Отредактировано 03.10.2019 1:40 VladCore . Предыдущая версия .
Re[2]: Не тащите сишные паттерны/навыки в прекрасный .net ;)
От: Somescout  
Дата: 03.10.19 10:39
Оценка:
Здравствуйте, VladCore, Вы писали:

VC>Задачу опиши. То, что в sobjectizer называется диспетчер, в .net является TaskScheduler. Тебе же надо что бы можно было управлять в одном потоке подписчики работали или в разных?


(Насчёт сишного довольно точно — как раз там такое и использовал, хотя и самописным решением.)

Я в принципе в соседнем комментарии описывал что бы мне хотелось видеть (и Event Aggregator примерно то что я хочу). Насчёт потоков — наверно это не принципиально, долгие задачи всё равно будут запускаться в отдельном потоке, хотя автоматическое распихивание по пулу потоков было бы неплохо. А если эта штука сумеет автоматический роутинг сообщений по ключу — то вообще замечательно.

  То что я хочу
class SomeClass1 {
    private readonly IMessageBus messageBus;

    public SomeClass1(IMessageBus messageBus) {
        this.messageBus = messageBus;

        messageBus.Subscribe<SetPageTitleEvent>(SetPageTitle);
    }

    private void SetPageTitle(SetPageTitleEvent evt) {
        ...
    }
}

class SomeOtherClass1 {
    private readonly IMessageBus messageBus;

    public SomeOtherClass1(IMessageBus messageBus) {
        this.messageBus = messageBus;
    }

    public void SomeAction() {
        messageBus.Send(new SetPageTitleEvent {
            Title = "Test title"
        });
    }
}
ARI ARI ARI... Arrivederci!
Re[3]: Не тащите сишные паттерны/навыки в прекрасный .net ;)
От: Danchik Украина  
Дата: 03.10.19 21:31
Оценка: 1 (1)
Здравствуйте, Somescout, Вы писали:

S>Здравствуйте, VladCore, Вы писали:


VC>>Задачу опиши. То, что в sobjectizer называется диспетчер, в .net является TaskScheduler. Тебе же надо что бы можно было управлять в одном потоке подписчики работали или в разных?


S>(Насчёт сишного довольно точно — как раз там такое и использовал, хотя и самописным решением.)


S>Я в принципе в соседнем комментарии описывал что бы мне хотелось видеть (и Event Aggregator примерно то что я хочу). Насчёт потоков — наверно это не принципиально, долгие задачи всё равно будут запускаться в отдельном потоке, хотя автоматическое распихивание по пулу потоков было бы неплохо. А если эта штука сумеет автоматический роутинг сообщений по ключу — то вообще замечательно.


Покурите все-таки Reactive Extensions. Использовать не обязательно, но мозг прочищаетЪ
Такой пустяк делается на ура.
Используйте мой предыдущий пост как вводную
Messages.Where(m => m.Key == “Some Key”).Subscribe(...)


А нет, давайте мне пачками по 100 штук и не дольше одной секунды
Messages.Where(m => m.Key == “Some Key”).Buffer(TimeSpan.FromSeconds(1), 100).Subscribe(...)


Черт еще одна очередь появилась, давайте объединим
Messages.Where(m => m.Key == “Some Key”)
 .Merge(Messages2.Where(m => m.Key == “Some Key”))
 .Subscribe(...);


Всю документацию разжёвывать не буду, надеюсь как-то задело.
Re[4]: Не тащите сишные паттерны/навыки в прекрасный .net ;)
От: Somescout  
Дата: 04.10.19 03:45
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Покурите все-таки Reactive Extensions. Использовать не обязательно, но мозг прочищаетЪ

D>Такой пустяк делается на ура.
D>Используйте мой предыдущий пост как вводную
D>
D>Messages.Where(m => m.Key == “Some Key”).Subscribe(...)
D>


D>А нет, давайте мне пачками по 100 штук и не дольше одной секунды

D>
D>Messages.Where(m => m.Key == “Some Key”).Buffer(TimeSpan.FromSeconds(1), 100).Subscribe(...)
D>


D>Черт еще одна очередь появилась, давайте объединим

D>
D>Messages.Where(m => m.Key == “Some Key”)
D> .Merge(Messages2.Where(m => m.Key == “Some Key”))
D> .Subscribe(...);
D>


D>Всю документацию разжёвывать не буду, надеюсь как-то задело.


Ок, спасибо, посмотрю.
ARI ARI ARI... Arrivederci!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.