ما هي الطريقة الجيدة لإنشاء طريقة 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);

نصائح أخرى

عموما تريد تجنب استخدام الموضوعات. في خبرتي ، إنها علامة على أنك تفعل شيئًا خاطئًا. يمكن ملاحظتها. إنشاء أو ربما توليد عادة ما تكون أفضل.

سأكون مهتمًا برؤية ما تحاول فعله بالفعل لمعرفة ما إذا كان بإمكاننا تقديم إجابة أفضل. لي

أفترض أنك تتحكم في فئة 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<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.

لم أقم بالانخراط في الإطار التفاعلي ، لكنني أعتقد أن هذا قريب من كيفية القيام بذلك.

يمكن ملاحظته. يحل generate مشكلتك ، على الرغم من أنك لا تحتاج إلى استخدام الحالة والمتابعة لعينة الخاص بك. هذا فقط يخلق ويعيد باستمرار ويعيد نتيجة المكالمة إلى 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. هناك مقالة رائعة مع رمز عينة تعرض تنفيذًا باستخدام structureMap.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top