ASP.NET中的业务/域对象

时间:2009-04-22 15:31:03

标签: asp.net design-patterns architecture domain-driven-design business-objects

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

以下是一个示例场景。

单个ASP.NET页面是特定Business / Domain对象的“Edit / New”页面,我们以“Person”为例。我们想要在此页面中编辑名称和地址信息。当用户进行编辑或输入数据时,在某些情况下表单应该回发以刷新自身。例如,在编辑地址时,他们会选择“国家/地区”。之后,状态/区域下拉列表将启用并刷新所选国家/地区的相关信息。这本质上是业务逻辑(基于某些依赖字段限制可用选择),这个逻辑由业务层处理(记住这只是一个例子,有很多业务情况,在回发期间逻辑更复杂 - 对于例如,保险行业在选择某些事物时需要/需要其他数据。

理想情况下,此逻辑仅存储在Business / Domain对象中(即,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();
}

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

思想?

3 个答案:

答案 0 :(得分:0)

我将你的示例放在我的'UI Enhancement'桶而不是BL中,验证条目是否正确是BL,但在我看来,简化数据输入是UI。

答案 1 :(得分:0)

对于非常简单的事情,我不会打扰常规的帖子,但会使用ajax方法。例如,如果我需要获取城市列表,我可能会有一个页面方法(或Web服务),给定一个州给我一个城市列表。

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

答案 2 :(得分:0)

这是我不同意的一句话:

this.StateRegionDropDownList.DataSource = person.AvailableStateRegions;

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

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

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

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

由于从Person域对象中分离出UI帮助器问题,这种编程风格往往“更容易测试”。