代码设计。组播代表救援?

时间:2013-05-28 03:47:54

标签: c# optimization

我目前正在努力解决设计问题,我正在寻找一些建议:) 想象一下,我有一组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实例的数量会因应用程序配置而异。

非常感谢任何反馈:) 顺便说一句..有没有任何已知的模式?想不到一个......

1 个答案:

答案 0 :(得分:0)

您可能需要查看 Mediator 设计模式。

您可以为给定的消息注册callback

Mediator.Instance.Register(callback, message);

然后,当您通知给定消息时,将调用所有已注册的回调:

Mediator.Instance.NotifyColleagues(message, parameters);

以下是使用Action<object>个委托的example,但建议您使用WeakReference代替delegates来确保垃圾回收。