0

只是试图收集有关通过 ASP.NET (2.0+) UI/Presentation 层操作业务/域对象的方法/无效方法的想法。特别是在 ASP.NET 代码直接与业务层对话的经典 ASP.NET LOB 应用程序情况下。我经常遇到这种类型的设计,想知道什么是理想的解决方案(即实现特定的模式),以及在没有实现“模式”的情况下不需要完全重写的最佳实用解决方案是什么。

这是一个示例场景。

作为特定业务/域对象的“编辑/新建”页面的单个 ASP.NET 页面,让我们以“人员”为例。我们想在此页面中编辑姓名和地址信息。当用户进行编辑或输入数据时,在某些情况下表单应该回发以刷新自身。例如,在编辑地址时,他们选择“国家”。之后,州/地区下拉菜单将启用并刷新所选国家/地区的相关信息。这本质上是业务逻辑(根据某些依赖字段限制可用选择),并且此逻辑由业务层处理(请记住,这只是一个示例,

理想情况下,此逻辑仅存储在业务/域对象中(即在 ASP.NET 代码中没有重复的逻辑)。为了实现这一点,我相信业务/域对象需要重新初始化,并根据每个回发的当前 UI 值设置它的状态。

例如:

private Person person = null;

protected void Page_Load()
{
    person = PersonRepository.Load(Request.QueryString["id"]);

    if (Page.IsPostBack)
        SetPersonStateFromUI(person);
    else
        SetUIStateFromPerson(person);
}

protected void CountryDropDownList_OnChange()
{
    this.StateRegionDropDownList.Enabled = true;
    this.StateRegionDropDownList.Items.Clear();
    this.StateRegionDropDownList.DataSource = person.AvailableStateRegions;
    this.StateRegionDropDownList.DataBind();
}

我见过的其他选项是将业务对象存储在 SessionState 中,而不是在每次页面加载备份时从存储库(也称为数据库)加载它。

想法?

4

3 回答 3

0

这是我不同意的一点:

this.StateRegionDropDownList.DataSource = person.AvailableStateRegions;

Person 是一个业务/域对象,但它不是应该处理状态/区域映射的对象(例如),即使那是做出决策的信息所在。

在需要多个变量来做出决定的更复杂的示例中,您通常想要做的是从您尝试结束的域对象开始,并在该对象上调用一个函数,该函数可以获得所有必需的做出商业决策的信息。

所以也许(在 State 类上使用静态函数):

this.StateRegionDropDownList.DataSource = State.GetAvailableStateRegions(person, ipAddress);

由于将 UI 助手关注点从 Person 域对象中分离出来,这种编程风格往往“更易于测试”。

于 2009-05-14T21:00:10.853 回答
0

我会将您的示例放在我的“UI 增强”存储桶中而不是 BL 中,验证条目是否正确是 BL,但在我看来,缓和数据输入是 UI。

于 2009-04-22T15:37:55.140 回答
0

对于非常简单的事情,我不会打扰定期回发,而是会使用 ajax 方法。例如,如果我需要获取城市列表,我可能有一个页面方法(或 Web 服务),它给定一个状态给我一个城市列表。

如果您的选择取决于多种参数,那么您的做法会很有效。至于在 Session 中存储东西是有好处的。您的实体是否同时对多个可见?如果是这样,当用户 A 和用户 B 都编辑相同的内容时会发生什么。另外,如果您每次加载都是每次都保存到数据库中吗?如果我正在编辑我的姓名,然后选择国家,但现在我的浏览器崩溃了,会发生什么情况。您是否更新了数据库中的名称?

于 2009-04-22T15:38:12.253 回答