【发布时间】:2015-06-01 13:22:15
【问题描述】:
我在this 问题中了解了策略模式。我在将所有这些包装在 MessageProcessor 中时遇到了问题,并且无法为我的类的用户提供任何强类型回调。
public class MessageProcessor
{
private IMessageProcessing Processing {get; set;} // a processing strategy
public void ProcessMessage(HubMessage message) //SignalR data message
{
ContentBase content = MessageProcessingBase.GetMessageContent(message); //just get content object from message
if (content is DocumentFile) //this content holds info about file to download
Processing = new DocumentFileProcessing();//implementation of IMessageProcessing strategy interface
Processing.ProcessMessage(message); //here a file is being downloaded and I want to raise event or call a callback method to inform a client (this class's caller) about a path of downloaded file
}
}
我试图在代码 cmets 中解释我的问题。如果我只提供一个确定消息类型并调用类型化策略类的 MessageProcessor 类,是否可以为我的 DLL 的用户提供任何类型化的回调?或者我应该让用户编写策略确定代码(在本例中为 MessageProcessor)?
我知道我可以在处理完成时调用事件,但该事件将在基本 MessageProcessing 类中,因此它不能具有类型化的事件参数。 编辑我提供了更多代码,以帮助了解我需要什么。
//lib code
public class Message
{
public string From { get; set; }
public string To { get; set; }
public MessageContentBase Conent{get;set;}
}
public class MessageContentBase
{
public string Note{get; set;}
}
public class DocumentFile: MessageContentBase
{
public string FilePath { get; set; }
}
public abstract class MessageProcessing
{
public abstract void ProcessMessage(Message message);
}
public class DocumentFileMessageProcessing:MessageProcessing
{
public override void ProcessMessage(Message message)
{
DocumentFile df = message.Conent as DocumentFile;
//1. download file
//2. raise event or do callback in client code with parameter df.FilePath
}
}
public class SomeOtherProcessing : MessageProcessing
{
public override void ProcessMessage(Message message)
{
MessageContentBase content = message.Conent;
//log.WriteLine("Message was from " + message.From);
}
}
public class MessageProcessor
{
MessageProcessing processing;
public void ProcessMessage(Message message)
{
if (message.Conent is DocumentFile)
processing = new DocumentFileMessageProcessing();
//else if, else if.....
processing.ProcessMessage(message);
}
}
// end lib code
public class Program //client code
{
public static void Main(string[] args)
{
Message m = new Message();
MessageProcessor mp = new MessageProcessor();
mp.ProcessMessage(m);
// need something to call return-result-type-dependent post processing code
}
}
【问题讨论】:
-
那么你需要让你的用户通过你的消息处理器吗?
-
这个类的调用者提供了IMessageProcessing策略?这样他就可以在那里回调。
-
我想制作这样的系统: 我的 DLL 库:接收消息,处理消息,将处理后的数据传递给库用户。然后库用户继续处理特定消息处理结果的特定数据。不,我想让 MessageProcessor 确定它应该使用哪个 IMessageProcessing 实现。
标签: c# strategy-pattern