【问题标题】:Is this pattern for subscribing to events okay?这种订阅事件的模式可以吗?
【发布时间】:2015-11-23 05:50:53
【问题描述】:

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

出于某种原因,这让我感到厌烦,但我无法解决。我想像这样新建一个听众而不保留对它的引用看起来很奇怪。

对于我正在尝试做的事情,是否有更好/更被接受的模式?

【问题讨论】:

    标签: c# design-patterns system.reactive


    【解决方案1】:

    我可能希望侦听器实现IObserver&lt;string&gt;,然后您可以像这样连接两者:

    logger.LogMessagesObservable.Subscribe(new ConsoleLogListener());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 2020-02-22
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多