А есть на .net какая-нибудь библиотека для реализации шины сообщений внутри приложения (т.е. чтобы можно было отправить сообщение и его поймали все подписавшиеся, аналог sobjectizer)? В принципе нетрудно и самому сделать, но не хотелось бы пилить свой велосипед.
Здравствуйте, Somescout, Вы писали:
S>А есть на .net какая-нибудь библиотека для реализации шины сообщений внутри приложения (т.е. чтобы можно было отправить сообщение и его поймали все подписавшиеся, аналог sobjectizer)? В принципе нетрудно и самому сделать, но не хотелось бы пилить свой велосипед.
S>ЗЫ. Желательно что-то простое и удобное.
а чем штатный event не подходит?
Здравствуйте, Somescout, Вы писали:
S>А есть на .net какая-нибудь библиотека для реализации шины сообщений внутри приложения (т.е. чтобы можно было отправить сообщение и его поймали все подписавшиеся, аналог sobjectizer)? В принципе нетрудно и самому сделать, но не хотелось бы пилить свой велосипед.
S>ЗЫ. Желательно что-то простое и удобное.
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()
Здравствуйте, Somescout, Вы писали:
S>А есть на .net какая-нибудь библиотека для реализации шины сообщений внутри приложения (т.е. чтобы можно было отправить сообщение и его поймали все подписавшиеся, аналог sobjectizer)? В принципе нетрудно и самому сделать, но не хотелось бы пилить свой велосипед.
S>ЗЫ. Желательно что-то простое и удобное.
Имхо, проще самому написать.
Вот как пример глянь.
Старая наработка, но вроде примерно то, что тебе нужно.
Если надо, чтобы паблишер не блокировался — вынести dispatch по подписчикам в отдельный тред. DataBus
Писаться отписаться, реактив шреактив — в классы, нуждающиеся в оповещениях, инжектить или любым другим способом пробрасывать синглтон PubSub'a — с одним методом Publish({from, to, message}) и одним событием Subscribe({from, to, message}). В тех же классах реализовать Dispose, удаляющий подписку на Subscribe событие, если создаются/удляются инстансы класса. При большом количестве подписчиков (например, айтемы в листе) — использовать проксированный PabSub в комбинации с обзервабл коллекцией (например). Для таких фигни точно не стоит тащить что то тяжелое. Другое дело, если уже подсели на какой нибудь призм — тогда надо смотреть что там есть ЕА в призме, как пример.
Re: Не тащите сишные паттерны/навыки в прекрасный .net ;)
Здравствуйте, Somescout, Вы писали:
S>А есть на .net какая-нибудь библиотека для реализации шины сообщений внутри приложения (т.е. чтобы можно было отправить сообщение и его поймали все подписавшиеся, аналог sobjectizer)? В принципе нетрудно и самому сделать, но не хотелось бы пилить свой велосипед.
S>ЗЫ. Желательно что-то простое и удобное.
Задачу опиши. То, что в sobjectizer называется диспетчер, в .net является TaskScheduler. Тебе же надо что бы можно было управлять в одном потоке подписчики работали или в разных?
Здравствуйте, 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 ;)
Здравствуйте, Somescout, Вы писали:
S>Здравствуйте, VladCore, Вы писали:
VC>>Задачу опиши. То, что в sobjectizer называется диспетчер, в .net является TaskScheduler. Тебе же надо что бы можно было управлять в одном потоке подписчики работали или в разных?
S>(Насчёт сишного довольно точно — как раз там такое и использовал, хотя и самописным решением.)
S>Я в принципе в соседнем комментарии описывал что бы мне хотелось видеть (и Event Aggregator примерно то что я хочу). Насчёт потоков — наверно это не принципиально, долгие задачи всё равно будут запускаться в отдельном потоке, хотя автоматическое распихивание по пулу потоков было бы неплохо. А если эта штука сумеет автоматический роутинг сообщений по ключу — то вообще замечательно.
Покурите все-таки Reactive Extensions. Использовать не обязательно, но мозг прочищаетЪ
Такой пустяк делается на ура.
Используйте мой предыдущий пост как вводную
Здравствуйте, Danchik, Вы писали:
D>Покурите все-таки Reactive Extensions. Использовать не обязательно, но мозг прочищаетЪ D>Такой пустяк делается на ура. D>Используйте мой предыдущий пост как вводную D>