Еще один вопрос "Как вы можете это сделать, не используя тему<t>" для C#
Здесь, на Stackru, есть много вопросов, касающихся 7-летней давности использования ReactiveX, а также вопроса о том , следует или нет использовать Предметы. На большинство этих вопросов в конечном итоге отвечают люди, спорящие взад и вперед по философским соображениям, и в итоге они оказываются довольно легкими в реальных примерах и говорят вместо "правильного" подхода по сравнению с "лучшим" подходом.
Я создал простой пример класса, который пытается соединить IHubProxy.On из SignalR с IObservable.
Вот мой класс, пожалуйста, покажи мне, как переписать этот класс, чтобы тема не была нужна.
Я просто не вижу способа сделать это.
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 ответ
Это оказалось намного легче, чем я первоначально ожидал. Продолжал копаться в этом и придумал этот ответ...
Будет ли это работать (не беспокойтесь о "это правильно")?
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;
}
}
}