我正在尝试为User Class实现数据映射器模式。
如果我理解正确,业务类User不应该调用任何持久性方法,而是将其放入Data Mapper类(UserMapper),映射器与数据库接口,理想情况下使用表网关类。
我有一些问题:
我会在哪里放置checkLogin方法?用户或UserMapper?我需要通过他的cookie检查当前访客的登录状态。由于用户无法引用数据库并且会话数据存储在那里,我必须使用mapper类吗?
我在哪里放置验证规则?我想把它们放在User类中,这样当我实例化它时,如果数据错误,我会得到一个异常。但是,我需要在mapper上使用checkLogin()等方法的验证规则。也许我不应该直接实例化新的User(),相反,我应该从数据映射器创建一个新用户,其中也将存储验证规则。你觉得怎么样?
看来这样,我最终得到了一个非常小的模型类和一个更大的数据映射器类。但由于我的大多数应用程序都是数据库交互,我认为这并不是那么糟糕。这是代码味道吗?
感谢。
答案 0 :(得分:1)
我认为你缺少应用程序中的组件。除了User和UserDataMapper之外,您还需要另一个执行业务逻辑验证的层。我们称之为UserBusiness。
在从UserDataMapper检索用户的详细信息之后,可以在UserBusiness中完成cookie /会话检查。 UserDataMapper将返回一个User对象,该对象将包含login,sessionId等所有详细信息。因此,UserBusiness可以使用这些详细信息对其进行验证。
您需要在UserBusiness以及User和UserDataMapper中进行验证。这样做的原因是你正在验证不同的东西。 UserBusiness中的验证规则将更加特定于业务,是限制应用程序规则的用户名(例如,大于8个字符可以是规则)。用户可以在不应该为空时验证字段是否为空。 UserDataMapper可以验证用户名是唯一的还是某些此类数据规则。您没有必要将验证规则限制为一个类。
臃肿的数据层并不罕见,但如果它不需要膨胀也不是一个好主意。数据层应仅处理与数据库相关的验证,检索和处理。在大多数情况下,做更多的事情都会有异味。