这种订阅事件的模式可以吗?
Is this pattern for subscribing to events okay?
我想要一个 "made available" 适合我的应用程序的记录器。我的应用程序记录有趣的事情,订阅者订阅这些消息。例如,订阅者可能将消息放入数据库、windows 事件日志或消息总线等。
我所写内容的简化复制如下:
using System;
using System.Reactive.Subjects;
namespace ConsoleApplication17
{
internal interface ILogger
{
void Log(String message);
}
internal class Logger : ILogger
{
private readonly Subject<String> _logMessagesObservable = new Subject<string>();
public void Log(string json)
{
_logMessagesObservable.OnNext(json);
}
public IObservable<String> LogMessagesObservable { get { return _logMessagesObservable; } }
}
internal class ConsoleLogListener
{
public ConsoleLogListener(IObservable<String> messages)
{
messages.Subscribe(Console.WriteLine);
}
}
internal class WindowsEventListener
{
public WindowsEventListener(IObservable<String> messages)
{
messages.Subscribe(WriteToEventLog);
}
private void WriteToEventLog(String message)
{
//Write to event log
}
}
class Program
{
static void Main(string[] args)
{
Logger logger = new Logger();
//Link up any subscribers
new ConsoleLogListener(logger.LogMessagesObservable);
new WindowsEventListener(logger.LogMessagesObservable);
//... more listeners go here.
DoSomeWork(logger);
}
private static void DoSomeWork(ILogger logger)
{
logger.Log("Something interesting");
logger.Log("Something else interesting");
}
}
}
但我对这样的代码不满意:
//Link up any subscribers
new ConsoleLogListener(logger.LogMessagesObservable);
new WindowsEventListener(logger.LogMessagesObservable);
//... more listeners go here.
出于某种原因,这让我很恼火,但我不能把我的手指放在上面。我想像这样新建一个监听器而不保留对它的引用看起来很奇怪。
对于我正在尝试做的事情,是否有更好/更可接受的模式?
我可能希望听众实现 IObserver<string>
,然后您可以像这样连接两者:
logger.LogMessagesObservable.Subscribe(new ConsoleLogListener());
我想要一个 "made available" 适合我的应用程序的记录器。我的应用程序记录有趣的事情,订阅者订阅这些消息。例如,订阅者可能将消息放入数据库、windows 事件日志或消息总线等。
我所写内容的简化复制如下:
using System;
using System.Reactive.Subjects;
namespace ConsoleApplication17
{
internal interface ILogger
{
void Log(String message);
}
internal class Logger : ILogger
{
private readonly Subject<String> _logMessagesObservable = new Subject<string>();
public void Log(string json)
{
_logMessagesObservable.OnNext(json);
}
public IObservable<String> LogMessagesObservable { get { return _logMessagesObservable; } }
}
internal class ConsoleLogListener
{
public ConsoleLogListener(IObservable<String> messages)
{
messages.Subscribe(Console.WriteLine);
}
}
internal class WindowsEventListener
{
public WindowsEventListener(IObservable<String> messages)
{
messages.Subscribe(WriteToEventLog);
}
private void WriteToEventLog(String message)
{
//Write to event log
}
}
class Program
{
static void Main(string[] args)
{
Logger logger = new Logger();
//Link up any subscribers
new ConsoleLogListener(logger.LogMessagesObservable);
new WindowsEventListener(logger.LogMessagesObservable);
//... more listeners go here.
DoSomeWork(logger);
}
private static void DoSomeWork(ILogger logger)
{
logger.Log("Something interesting");
logger.Log("Something else interesting");
}
}
}
但我对这样的代码不满意:
//Link up any subscribers
new ConsoleLogListener(logger.LogMessagesObservable);
new WindowsEventListener(logger.LogMessagesObservable);
//... more listeners go here.
出于某种原因,这让我很恼火,但我不能把我的手指放在上面。我想像这样新建一个监听器而不保留对它的引用看起来很奇怪。
对于我正在尝试做的事情,是否有更好/更可接受的模式?
我可能希望听众实现 IObserver<string>
,然后您可以像这样连接两者:
logger.LogMessagesObservable.Subscribe(new ConsoleLogListener());