这种订阅事件的模式可以吗?

丹尼尔·詹姆斯·布莱尔斯

我希望有一个对我的应用程序可用的记录器。我的应用程序记录了有趣的事情,订阅者订阅了这些消息。例如,订户可能将消息放入数据库,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());

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

这种订阅事件的模式可以吗?

来自分类Dev

Terraform-创建Azure事件网格订阅-可以吗?

来自分类Dev

这种用于const指针的方法可以吗?

来自分类Dev

这种用于const指针的方法可以吗?

来自分类Dev

非反应式Meteor db订阅可以吗?

来自分类Dev

这种在龙卷风中使用线程池的样式可以吗?

来自分类Dev

Windows7 / Ubuntu的这种分区方案还可以吗?

来自分类Dev

Windows7 / Ubuntu的这种分区方案还可以吗?

来自分类Dev

使用printf可以吗?

来自分类Dev

vCharBarChart向右可以吗?

来自分类Dev

使用pageswitch可以吗?

来自分类Dev

应用为64位时以32位模式运行代码,可以吗?

来自分类Dev

在猫鼬模式中具有ObjectId的字段类型可以吗

来自分类Dev

如果在viewmodel模式中显示进度指示器,可以吗?

来自分类Dev

Java中的事件订阅模式

来自分类Dev

方法可以吗?在javascript文件中

来自分类Dev

PubNub + Parse集成。这个可以吗?

来自分类Dev

使用LinearLayout代替FrameLayout可以吗?

来自分类Dev

`require“ rubygems”`返回`false`可以吗?

来自分类Dev

这样创建PHP变量可以吗?

来自分类Dev

在<code>中使用<div>可以吗?

来自分类Dev

从空类继承可以吗?

来自分类Dev

robots.txt-可以吗?

来自分类Dev

锚点类型=按钮可以吗?

来自分类Dev

MATLAB中的稀疏表格,可以吗?

来自分类Dev

不调用close方法可以吗?

来自分类Dev

严格的别名规则可以吗?

来自分类Dev

创建动态别名,可以吗?

来自分类Dev

让里面的单子符号可以吗?