Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 订阅活动的这种模式可以吗?_C#_Design Patterns_System.reactive - Fatal编程技术网

C# 订阅活动的这种模式可以吗?

C# 订阅活动的这种模式可以吗?,c#,design-patterns,system.reactive,C#,Design Patterns,System.reactive,我想有一个记录器是“提供”给我的应用程序。我的应用程序记录有趣的事情,订阅者订阅这些消息。例如,订户可以将消息放入数据库、windows事件日志或消息总线等 下面是我所写内容的简化副本: using System; using System.Reactive.Subjects; namespace ConsoleApplication17 { internal interface ILogger { void Log(String message); }

我想有一个记录器是“提供”给我的应用程序。我的应用程序记录有趣的事情,订阅者订阅这些消息。例如,订户可以将消息放入数据库、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");
        }
    }
}
不知什么原因,这让我很恼火,但我不能把我的手指放在上面。我想这只是看起来很奇怪,新的听众像这样,而不是保持它的参考


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

我可能希望侦听器实现
IObserver
,然后您可以这样将两者连接起来:

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