Еще один вопрос «Как это можно сделать без использования темы <t>» для C # - PullRequest
0 голосов
/ 15 февраля 2019

Здесь много вопросов о StackOverflow, возникших в течение 7 лет назад об использовании ReactiveX, а do или не об использовании Субъектов .На большинство этих вопросов в конечном итоге отвечают люди, спорящие взад и вперед по философским соображениям, и в конечном итоге они довольно легки в реальных примерах и говорят вместо «правильного» подхода по сравнению с «лучшим» подходом.

У меня естьсоздал простой пример класса, который пытается соединиться с IHubProxy.On в SignalR и IObservable.

Вот мой класс, пожалуйста, покажите мне, как переписать этот класс, чтобы Subject не был нужен.

Я просто не вижу способа сделать это.

using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Client;
using Microsoft.AspNet.SignalR.Hubs;
using System.Reactive.Linq;
using Owin;
using System;
using System.Reactive.Subjects;

namespace Acme.Core.SignalR
{
    public class SignalRPipe :IObservable<PipeCommand>, IDisposable
    {
        readonly IHubProxy _MyHub;
        readonly IDisposable _HubOnListener;

        // this next line is BAD and I want to get rid of it, but I can't figure out how.
        private readonly Subject<PipeCommand> subject = new Subject<PipeCommand>();

        private SignalRPipe() : base()
        {
        }

        private SignalRPipe( IHubProxy hub ) : this()
        {
            _MyHub = hub;
            _HubOnListener = _MyHub.On<PipeCommand>( "OnPipeCommand" , OnPipeCommand );
        }

        private void OnPipeCommand( PipeCommand obj )
        {
            subject.OnNext( obj );
        }

        public IDisposable Subscribe( IObserver<PipeCommand> observer )
        {
            return subject.Subscribe( observer );
            //var rtrn = Observable.Create<PipeCommand>( ob => {observer.Subscribe(t=> {  }, ,  } );
            //return rtrn;
        }


        #region IDisposable Support
        private bool disposedValue = false; // To detect redundant calls

        protected virtual void Dispose( bool disposing )
        {
            if ( !disposedValue )
            {
                disposedValue = true;
                if ( disposing )
                {
                    _HubOnListener.Dispose();
                    subject.Dispose();
                }

            }
        }

        public void Dispose()
        {
            // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
            Dispose( true );
        }

        #endregion

    }


}

1 Ответ

0 голосов
/ 16 февраля 2019

Это оказалось намного проще, чем я первоначально ожидал.Продолжал копаться в этом и придумал этот ответ ...

Будет ли это работать (не беспокойтесь о "это правильно")?

using Microsoft.AspNet.SignalR.Client;
using System;

namespace Acme.Core.SignalR
{
    public class SignalRPipe : IObservable<PipeCommand>
    {
        readonly IHubProxy _MyHub;

        private SignalRPipe() : base()
        {
        }

        private SignalRPipe( IHubProxy hub ) : this()
        {
            _MyHub = hub;
        }

        public IDisposable Subscribe( IObserver<PipeCommand> observer )
        {
            var rtrn = _MyHub.On<PipeCommand>( "OnPipeCommand" , pc => observer.OnNext( pc ) );
            return rtrn;
        }

    }

}
...