Сегодня, изучая API ReactiveX, я создал вспомогательный класс ObservedVariable, который выглядит следующим образом:
class ObservedVariable<T> {
private T variable;
private Subject<T> subject = new Subject<T>();
public ObservedVariable(T variable) { this.variable = variable; }
public IObservable<T> get() { return subject.AsObservable(); }
public void get(Action<T> onChange) {
get().Subscribe(onChange);
onChange(variable);
}
public void set(T newValue) {
variable = newValue;
subject.OnNext(variable);
}
}
class MyUserModel {
public ObservedVariable<string> userName = new ObservedVariable<string>("Carl");
}
private void exampleOfAnObservedVar() {
var viewThatIsAutomaticallyUpdated = GetComponent<Text>();
var exampleUser = new MyUserModel();
exampleUser.userName.get(userName => { viewThatIsAutomaticallyUpdated.text = userName; });
exampleUser.userName.set("Caaaarl");
}
Затем я узнал, что BehaviorSubject уже делал именно то, что я хотел с моей реализацией ObservedVariable, и изменил пример на:
public static class BehaviorSubjectExtensions {
public static void get<T>(this BehaviorSubject<T> self, Action<T> onChange) { self.Subscribe(onChange); }
public static void set<T>(this BehaviorSubject<T> self, T newValue) { self.OnNext(newValue); }
}
class MyUserModel {
public BehaviorSubject<string> userName = new BehaviorSubject<string>("Carl");
}
private void exampleOfAnObservedVar() {
var viewThatIsAutomaticallyUpdated = GetComponent<Text>();
var exampleUser = new MyUserModel();
exampleUser.userName.get(userName => { viewThatIsAutomaticallyUpdated.text = userName; });
exampleUser.userName.set("Caaaarl");
}
Мой главный вопрос: если я не помещаю BehaviorSubject непосредственно в модель данных, то у меня есть дублированное состояние, поэтому рекомендуется ли использовать BehaviorSubject (s) непосредственно в слое модели данных, если я хочу использовать такие реактивные поля?