使用带有单次和多次返回的工厂模式

问题描述

我实现了一个工厂模式,用于处理从 MessageBase 类派生的多个消息(例如 StartMessage 等)。

为了处理这些消息,我有从 IMessageHandler 派生的不同处理程序:

public interface IMessageHandler
{
      MessageHandleResult HandleMessage(MessageBase message);
}

public class StartMessageHandler: IMessageHandler
{
      public MessageHandleResult IMessageHandler.HandleMessage(MessageBase message)
      {
         ...
      }
}

要检索处理程序,非常简单:

var messagehandler = MessageHandlerFactory.GetMessageHandlerFor(message);
var result = messagehandler.HandleMessage(message);

但是在新的情况下,我必须处理一种新类型的消息(它也巧妙地从 MessageBase 派生而来)。这条新消息的消息处理程序必须以消息结果列表的形式返回结果:

public class NewMessageHandler: IMessageHandler
{
      public List<MessageHandleResult> IMessageHandler.HandleMessage(MessageBase message)
      {
         ...
      }
}

关于如何以正确的方式重构的任何想法。在引入这种新的消息类型之前,该解决方案对 6 种类型的消息非常有效。

解决方法

将界面更改为:

public interface IMessageHandler
{
      IEnumerable<MessageHandleResult> HandleMessage(MessageBase message);
}

这将使您能够免除 MessageHandlerFactory.GetMessageHandlerFor 步骤,这无论如何都是一种设计味道。

相反,您可以简单地将消息传递给消息处理程序列表并连接结果:

var results = messagehandlers.SelectMany(h => h.HandleMessage(message));

不处理 MessageBase 的特定子类型的消息处理程序可以返回一个空列表。