Составление IObservables и уборка после регистрации - PullRequest
1 голос
/ 20 сентября 2019

У меня есть некоторый код в классе, который принимает FileSystemWatcher события и объединяет их в событие в моем домене:

(Обратите внимание, что методы *AsObservable являются расширениями из других мест в моемпроект, они делают то, что они говорят ?.)

            watcher = new FileSystemWatcher(ConfigurationFilePath);

            ChangeObservable = Observable
                .Merge(
                    watcher.ChangedAsObservable().Select((args) =>
                    {
                        return new ConfigurationChangedArgs
                        {
                            Type = ConfigurationChangeType.Edited,
                        };
                    }),
                    watcher.DeletedAsObservable().Select((args) =>
                    {
                        return new ConfigurationChangedArgs
                        {
                            Type = ConfigurationChangeType.Deleted,
                        };
                    }),
                    watcher.RenamedAsObservable().Select((args) => 
                    {
                        return new ConfigurationChangedArgs
                        {
                            Type = ConfigurationChangeType.Renamed,
                        };
                    })
                );

            ChangeObservable.Subscribe((args) =>
            {
                Changed.Invoke(this, args);
            });

То, что я пытаюсь обернуть голову, поскольку я учусь, являются лучшими методами вокруг именования, владения и очистки IObservable и IDisposable возвращаются с помощью кода, подобного следующему.

Итак, некоторые конкретные вопросы:

  • Можно ли сгенерировать IObservable s из класса, который их создает?Например, соответствует ли свойство, которому я назначаю эту цепочку, значение public?
  • Соответствует ли имя свойства ChangeObservable тому, что большинство людей считают оптимальной практикой при использовании реактивных расширений .net?
  • Нужно ли вызывать Dispose для любой из моих подписок на эту цепочку, или это достаточно безопасно, чтобы оставить все вплоть до сборки мусора, когда содержащий класс выходит из области видимости?Имейте в виду, я наблюдаю за событиями watcher, так что там есть некоторый общий жизненный цикл.
  • Можно ли взять наблюдаемое и связать его с событием в моем собственном классе (Changed впример выше), или это идея остаться вне родной системы .net event и пропустить мою IObservable?

Другие советы и рекомендации всегда приветствуются!10


1 Ответ

3 голосов
/ 20 сентября 2019

Можно ли слить IObservables из класса, который их создает?Например, свойство, которое я назначаю этой цепочке, будет публичным?

Да.

Соответствует ли имя свойства ChangeObservable тому, что большинство людей считают оптимальной практикой при использовании реактивных расширений .net?

Субъективный вопрос.Может быть FileChanges?Тот факт, что это наблюдаемое, ясно из типа.

Нужно ли вызывать Dispose для какой-либо из моих подписок на эту цепочку, или это достаточно безопасно, чтобы оставить все вплоть до сборки мусора, когдасодержащий класс выходит из области видимости?

ChangeObservable.Subscribe в конце может жить вечно, не позволяя объекту собирать мусор при подписке на событие, хотя это также может быть вашим намерением.Операторские подписки, как правило, в порядке.Я не вижу код для ваших ChangedAsObservable подобных функций.Если они не включают Subscribe или подписку на события, они, вероятно, тоже подойдут.

Имейте в виду, я наблюдаю за событиями от наблюдателя, поэтому есть некоторый общий жизненный цикл там,

Поскольку FileWatcher реализует IDisposable, вам, вероятно, следует использовать Observable.Using вокруг него, чтобы вы могли комбинировать жизненные циклы.

Можно ли взять наблюдаемоеи подключить их к событию в моем собственном классе (изменено в приведенном выше примере), или это идея остаться вне родной системы событий .net и пропустить мой IObservable?

Я бы предпочелостаться в Rx.Проблема с подписками на события заключается в том, что они обычно живут вечно.Вы теряете возможность контролировать жизненный цикл подписки.Они также чувствуют себя намного примитивнее.Но опять же, это немного субъективно.

...