Есть ли способ отказаться от подписки на тему System.Reactive?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Есть ли способ отказаться от подписки на тему System.Reactive?

Сообщение Anonymous »

Я новичок в System.Reactive и пытаюсь понять, как использовать это расширение для некоторых сценариев.
У меня в основном три компонента, один из которых создает сообщение, а остальные являются получателями сообщения.

Код: Выделить всё

public class Messager : IMessager
{
private readonly Subject _subject = new();
private readonly List _disposables = [];
public void Dispose()
{
_subject?.Dispose();
foreach (var eachDisposable in _disposables)
{
eachDisposable?.Dispose();
}
}
public void Emit(int value)
{
_subject.OnNext(value);
}
public void OnEmit(Action action)
{
_disposables.Add(_subject.Subscribe(action));
}
}
IMessager наследует IDisposable, а IMessager регистрируется как Scoped в файле Program.cs.< /p>

Код: Выделить всё

ComponentOne.razor
и ComponentTwo.razor выглядят точно так же, как приведенный ниже код

Код: Выделить всё

@inject IMessager _messager;

@value





@code {
private int value;
protected override void OnInitialized()
{
base.OnInitialized();
_messager.OnEmit(Action);
}

private void Action(int value)
{
this.value = value;
StateHasChanged();
}
}
MessageCreator.razor выглядит так:

Код: Выделить всё

@inject IMessager _messager;

ClickMe

@code {
private int count = 0;
private void ClickMe()
{
count++;
_messager.Emit(count);
}
}
А в доме они называются home.razor

Код: Выделить всё

@page "/"







Если я нажму кнопку ClickMe в ComponentOne -> MessageCreator -> ClickMe — это увеличит счетчик до 1. Оба компонента обновляются со значением 1 потому что оба «подписываются» через OnEmit. То же самое касается ComponentTwo, только с отдельным экземпляром MessageCreator.razor.
Итак, вот некоторые из моих вопросов:
Вопрос 1: IMessager зарегистрирован в Scoped, но когда я попробовал с Transient, он не работает, почему? (Потому что ComponentOne.razor и MessageCreator.razor должны иметь один и тот же объект. Я думаю)
Вопрос 2. Есть ли способ отказаться от подписки. Скажем так, в некоторых случаях ComponentOne не хочет получать никаких уведомлений?
Вопрос 3. Я хочу, чтобы сообщение генерировалось при нажатии на ComponentOne -> MessageCreator - > ClickMe должен получать только от ComponentOne, но не от ComponentTwo.(или мне нужно использовать что-то другое, кроме Subjct)

Подробнее здесь: https://stackoverflow.com/questions/792 ... m-reactive
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»