2012-02-11 61 views
1

我不确定我是否应该直接在用户界面中使用域对象。例如,我希望为域实体用户User设计用户界面,它具有用户ID,名称,密码和角色列表。实体的设计是这样一种方式,它永远处于无效状态(例如无效的密码或空的UserID)域模型和用户界面

public class User { 
    public User(String userId, String name, String password) { 
     //Initialization and validation 
    } 

    public String getUserId { 
     /*implementation*/ 
    } 
    public void changePassword(String oldPassword, String newPassword) { 
     /*Set new password if it complies with the rules 
     and if the the old one is correct*/ 
    } 

    public void setName(String Name) { 
     /*implementation*/ 
    } 
    public String getName() { 
     /*implementation*/ 
    } 

    public List<Role> getRoles() { 
     /*implementation*/ 
    } 

    public void addRole(Role role) { 
     /*implementation*/ 
    } 
} 

什么是设计用户界面的最合适的方法是什么?

1)坚持域模型:设计3个窗口。窗口“新用户”使用给定的userId,名称和密码创建一个新用户。另一个窗口“更改密码”更改密码,另一个窗口“修改用户”允许您修改现有用户的名称和角色

2)可能希望仅使用一个窗口来创建具有给定userId,名称,密码和角色列表。即使我还没有输入userId,我应该可以添加角色。

选项1最容易实现,因为我可以直接在用户界面中使用域对象。但用户界面可能会导致使用痛苦。 选项2是可取的,但域对象不能直接使用。如果用户尚未创建,我看不到如何添加角色。我无法创建用户,因为那时我可能没有正确的信息,例如表示userId的临时空文本框。我怎样才能做到这一点?

我能想到的唯一一个干净的解决方案是创建类,以便在用户界面中使用,以模仿真实域对象中的信息。所以我可以创建一个空的用户来添加角色,然后设置userId。用户界面可以使用该信息来创建真实的域对象。

有没有简单的方法呢?这通常如何管理?

回答

1

这是很多问题,但是您有权要求他们,因为当您开始查看如何在图层之间传递对象时,这些问题至关重要。

让我们先从

“这是怎么一般管理?”

您正确地指出,您想向用户展示域对象的方式并不总是以其原始形式 - 有时您希望显示少一点,就像在用户示例中那样角色的添加可以在用户创建/修改的不同用户界面中进行,有时您希望显示更多,并排显示2个对象,或者显示来自2个对象的混合数据。

稍微精确一点:您认为选项1(多个窗口)更贴近领域模型,而我认为它倾向于更少地模仿模型,因为它没有将整个领域对象呈现在单一屏幕 - 但这是一个细节。

那么你通常如何处理?那么正是由于你说-by创建你的意见

唯一干净的解决方案,我能想到是创建类的 使用的用户界面,将模拟信息在现实领域的定制UI特有的对象 对象。所以我可以创建一个空的用户来添加角色,然后 设置userId。

这些通常被称为DTO的,视图模型对象在.NET/MVVM世界等

用户界面可以使用该信息来创建真正的域 客体。

通常,从UI对象创建/更新域对象通常不是UI本身的责任。映射在另一层完成。

现在,我们已经看到了基本解决,让我们来看看它是如何异常管理;)

有几个选择。其中之一是Naked Objects模式,其中所有用户界面都是域对象的直接表示。这很大程度上简化了这个问题,但是这样的UI在工作流程和易用性方面始终是最好的,这仍然有待观察。

或者,您可以在表示层中使用您的域对象。这个recent post指出了当你有同一个对象的多个表示并且检查在所有层中使用同一个域对象的可能性时发生的问题。这里的问题是,你可能不得不强制一些数据到你的域对象中,而这些数据并不是纯粹的域相关的,你也可能不得不放弃一些不变量(比如,“一个用户不能存在没有至少一个角色附加“,如果你分开用户创建和角色分配用户界面)。

最后,回到用户/角色示例和“如果用户尚未创建,我不知道如何添加角色”:您不必为最终用户拥有现有的用户对象的应用程序能够选择角色。您可以在屏幕上选择角色,并保留它们直到User对象的实际实例完成,并且仍然强制执行所有必填字段,如ID。

0

选项2有什么问题?您可以先创建一个新的用户对象,然后将规则添加到它。如果您没有创建新的用户对象(例如空的用户标识文本框)的所有必要信息,则只需向用户发出通知,指出该字段需要填写。