我有以下代表
System.Action<SomeMessage> TheDelegate;
其中有几个订阅者,但是当消息通过所有订阅者时,每个订阅者都会对其执行某些操作,并且该更改会持续存在并传递给下一个订阅者,这是我不想要的。< / p>
有没有办法可以将原始邮件用作所有订阅者的参数?
编辑: SomeMessage是一个类,因此它通过订阅者
通过引用传递答案 0 :(得分:0)
列举两种可能性:
每次将邮件传递给订阅者时都要克隆邮件。如何构建消息,克隆是否便宜?也许你甚至可以把它传递给struct
?克隆可以通过实现ICloneable
来完成,基于每个属性进行克隆,这可以通过框架自动化,例如Automapper(http://automapper.org),或者,如果你搞砸了一些像JSON这样的JSON Lib .NET,您可以执行var clone = FromJson(ToJson(original))
之类的操作。这肯定不是一种快速的方法,而是一种适用于深层物体的简单方法。
另一种方法是让邮件本身不可变,让每个订阅者将更改请求传递给某种收集器,例如
interface ICommandSequence
{
void AddCommand(ICommand);
}
并且Action变为
System.Action<ImmutableMessage, ICommandSequence>
现在,每个订阅者都可以将命令实例传递给ICommandSequence
实例。在调用所有订阅者之后,您可以执行命令序列,并将更改应用于消息对象。命令的外观取决于消息和消息处理的外观。
如果您的应用程序关注的是专注于业务领域的设计,那么您可以构建代表真实业务事件的命令,例如在CQRS中完成。