Что хороший путь состоит в том, чтобы создать IObservable для метода?

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

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

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

14
задан Ruben Bartelink 11 February 2010 в 10:34
поделиться

3 ответа

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

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);
8
ответ дан 1 December 2019 в 16:15
поделиться

Я предполагаю, что вы управляете классом Foo, поскольку вы говорите о добавлении события к нему как один из вариантов. Поскольку вы владеете классом, есть ли причина, по которой вы не можете определить свою собственную реализацию IObservable для метода 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 , которое позволяет подписаться на значения, возвращаемые методом 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.

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

1
ответ дан 1 December 2019 в 16:15
поделиться

Я бы посмотрел на модель EventAggregator. Есть отличная статья с примерами кода, в которой показана реализация со структурной картой (StructureMap).

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

-2
ответ дан 1 December 2019 в 16:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: