我目前正在努力解决设计问题,我正在寻找一些建议:) 想象一下,我有一组INotificationHandler对象,界面定义如下:
public interface INotificationHandler
{
void Notify(string message);
}
现在我想为每个INotificationHandler实例调用Notify(...)。我想过为此使用多播委托。然而直到最近我偶然发现了一段代码,其中表达式树用于类似的任务(我想)...不幸的是我不记得我在哪里看到那段代码:(
我关键的问题是性能,因为这种类型的方法调用会经常发生。 由于这是在Web应用程序上下文中运行的,我可以确定每个实例的方法都被调用了吗?
最终目标是让一个“wrapper”类调用某个接口类型的所有其他实例。 我还考虑将其应用于日志记录。 ..
ILogger dispatcher.Trace(...) // does nothing itself, only calls other existing ILogger instances.
--> calls NLogLogger(:ILogger).Trace(...)
--> calls SomeOtherLogger(:ILogger).Trace(...)
--> calls SomeOtherLogger2(:ILogger).Trace(...)
--> calls SomeOtherLogger3(:ILogger).Trace(...)
我做这样的事情的动机是实现一个NullObject模式,我可以确定任何对我的ILogger(它总是我的委托调度程序类)的调用都会成功。其次 生活ILogger实例的数量会因应用程序配置而异。
非常感谢任何反馈:) 顺便说一句..有没有任何已知的模式?想不到一个......
答案 0 :(得分:0)
您可能需要查看 Mediator 设计模式。
您可以为给定的消息注册callback
:
Mediator.Instance.Register(callback, message);
然后,当您通知给定消息时,将调用所有已注册的回调:
Mediator.Instance.NotifyColleagues(message, parameters);
以下是使用Action<object>
个委托的example,但建议您使用WeakReference
代替delegates
来确保垃圾回收。