Какой хороший способ создать IOBServable для метода?

StackOverflow https://stackoverflow.com/questions/2197389

  •  25-09-2019
  •  | 
  •  

Вопрос

Скажем, у нас есть класс:

public class Foo
{
   public string Do(int param)
   {
   }
}

Я хотел бы создать наблюдаемые значения, которые производится Делать метод. Один из способов сделать это было бы создать событие, которое называется Делать и использовать Наблюдаемый создать наблюдаемый. Но как-то я не чувствую себя хорошо о создании мероприятия только ради этой задачи. Есть ли лучший способ сделать это?

Это было полезно?

Решение

Ответ Мэтта заставил меня думать об этом:

public class Foo
{
    private readonly Subject<string> _doValues = new Subject<string>();

    public IObservable<string> DoValues { get { return _doValues; } }

    public string Do(int param)
    {
        var ret = (param * 2).ToString();
        _doValues.OnNext(ret);
        return ret;
    }
}


var foo = new Foo();
foo.DoValues.Subscribe(Console.WriteLine);
foo.Do(2);

Другие советы

Как правило, вы хотите избежать использования предметов. В моей экспертизе это знак, который вы делаете что-то не так. Наблюдаемый. Create или, возможно, генерировать, как правило, лучше подходит.

Мне было бы интересно посмотреть, что вы на самом деле пытаетесь сделать, чтобы увидеть, сможем ли мы предоставить лучший ответ. Ли

Я предполагаю, что вы контролируете класс FOO, поскольку вы говорите о добавлении события к нему как один вариант. Поскольку вы владеете классом, есть ли какие-либо причина, по которой вы не можете определить свою собственную реализацию iBseriable для метода DO?

public class Foo
{
    DoObservable _doValues = new DoObservable();

    public IObservable<String> DoValues
    {
        return _doValues;
    }

    public string Do(int param)
    {
        string result;
        // whatever
        _doValues.Notify(result);
    }
}

public class DoObservable : IObservable<String>
{
    List<IObserver<String>> _observers = new List<IObserver<String>>();

    public void Notify(string s)
    {
        foreach (var obs in _observers) obs.OnNext(s);
    }

    public IObserver<String> Subscribe(IObserver<String> observer)
    {
        _observers.Add(observer);
        return observer;
    }
}

Ваш класс сейчас имеет Observable<String> Свойство, которое предоставляет способ подписаться на значения, возвращенные из метода DO:

public class StringWriter : IObserver<String>
{
    public void OnNext(string value)
    {
        Console.WriteLine("Do returned " + value);
    }

    // and the other IObserver<String> methods
}

var subscriber = myFooInstance.DoValues.Subscribe(new StringWriter());
// from now on, anytime myFooInstance.Do() is called, the value it 
// returns will be written to the console by the StringWriter observer.

Я не слишком промаснул в реактивную структуру, но я думаю, что это близко к тому, как вы это сделаете.

Наблюдаемый. Сохранение решает вашу проблему, хотя вам не нужно использовать условие и продолжить для вашего образца. Это просто создает и объект и постоянно возвращает результат вызова на doit ():

Observable.Generate (
  new Foo(),
  item => true, // in your example, this never terminates
  item => item, // we don't actually do any state transitions
  item => { return item.DoIt(); }  // This is where we emit our value
  );

На практике вы часто хотите отслеживать какое-то состояние и иметь некоторое условие прекращения. Генерация позволяет легко.

Я бы посмотрел на модель EventagGregator. Существует отличная статья с примером кода, который показывает реализацию со структурой.

http://www.codeproject.com/kb/architecture/event_aggregator.aspx.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top