В этот ответ на вопрос о Subject<T>
Энигматичность упоминается:
как в сторону, вы должны стараться избегать использования предметов вообще. общее правило заключается в том, что если вы используете тему, то вы делаете что-то не так.
Я часто использую объекты в качестве полей поддержки для свойств IObservable
, которые, вероятно, были бы событиями .NET за несколько дней до Rx. например вместо чего-то вроде
public class Thing
{
public event EventHandler SomethingHappened;
private void DoSomething()
{
Blah();
SomethingHappened(this, EventArgs.Empty);
}
}
Я мог бы сделать
public class Thing
{
private readonly Subject<Unit> somethingHappened = new Subject<Unit>();
public IObservable<Unit> SomethingHappened
{
get { return somethingHappened; }
}
private void DoSomething()
{
Blah();
somethingHappened.OnNext(Unit.Default);
}
}
Итак, если я хочу избежать использования Subject
, что было бы правильным способом сделать это? Или я должен придерживаться использования событий .NET в своих интерфейсах, даже если они будут потребляться кодом Rx (возможно, FromEventPattern
)?
Кроме того, немного более подробная информация о том, почему использование Subject
, как это, является плохой идеей, было бы полезно.
Обновить. Чтобы сделать этот вопрос более конкретным, я говорю об использовании Subject<T>
в качестве способа получить код не-Rx (возможно, вы работаете с каким-либо другим наследием кода) в мир Rx. Итак, что-то вроде:
class MyVolumeCallback : LegacyApiForSomeHardware
{
private readonly Subject<int> volumeChanged = new Subject<int>();
public IObservable<int> VolumeChanged
{
get
{
return volumeChanged.AsObservable();
}
}
protected override void UserChangedVolume(int newVolume)
{
volumeChanged.OnNext(newVolume);
}
}
Где вместо использования событий тип LegacyApiForSomeHardware заставляет вас переопределять виртуальные методы как способ получения уведомлений "это только что случилось".