【发布时间】:2008-11-11 17:58:22
【问题描述】:
想象以下场景 - 我们的 Page1 包含控件 Control A 和 Control B。
假设控件 A 有一个按钮,单击此按钮时我们希望控件 B 做出反应。 但是我们想以抽象的方式来做这件事,即我们不能让 Control B 知道关于 Control A 的任何事情,反之亦然。
这样我们可以单独开发这些控件,并通过单元测试来驱动它们。
现在,我认为我有解决方案,只是想知道你们的想法。
在控件 A 的按钮单击时,我在 Session 上放置了一个“消息”,即 Session["MESSAGES"] = "ControlA_Click"。
在 Page1 中,在 Page_LoadComplete() 上,我调用了 ProcessMessages,如下所示:
List<Message> messages = SessionMessages.GetMessageList(Page);
foreach(Message m in messages)
{
//Get Controls
ControlA controlA = FindControl("controlA") as ControlA;
controlA .ProcessMessage(m);
ControlB controlB = FindControl("controlB") as ControlB;
controlB.ProcessMessage(m);
}
在 ControlB 的 ProcessMessage() 方法中,我们可以对 ControlB 感兴趣的消息做出反应,如下所示:
if (m.MessageName == SessionMessages.C_MESSAGE_SEARCH)
{
this.Visible = true;
}
对我来说,这似乎可行。它允许我们完全独立地开发这些控件,同时仍然允许抽象级别的控件间通信。
我能想到的唯一可能导致崩溃的是也许与页面和用户控件相关的 ASP.NET 生命周期。我认为它的方式是所有事件都应该在拥有页面上调用 Page_LoadComplete() 之前在控件上处理。
想法?
【问题讨论】:
-
@Steven - 你说得对,我的意思是说我有点意识到我在这里有点滥用 Session ......我想我正在寻找“任何地方”我可以存储一些状态信息。但期待关于这整个概念是否会成功的意见!
标签: asp.net unit-testing mocking separation-of-concerns isolation