用户工厂和存储库

时间:2011-04-18 19:42:45

标签: .net domain-driven-design repository factory

我正在确定设计方法。我想要你的意见

我有两种类型的用户

  1. 企业内部用户
  2. 客户用户
  3. 技术上它们之间的根本区别是

    1. 公司:不需要在系统中保存密码,只需要保存角色(针对AD的身份验证)
    2. 客户用户:在系统中保存密码并拥有关联的客户ID。
    3. 我有一个表User,它有像这样的列

      User Name  
      Password  
      Roles  
      Customer ID  
      

      如果我使用抽象工厂模式抽象用户创建过程,我会得到两种类型的用户对象。

      现在,在创建存储库时,我该如何处理它?我是否创建了2个不同的存储库来处理单个用户类型对象(映射到同一个表)

3 个答案:

答案 0 :(得分:1)

您应该考虑在用户表中添加用户类型列。这样,您可以跟踪每条记录所代表的用户类型。在存储库层中的查找/获取操作上创建用户实体时以及执行添加或更新过程时,这将非常有用。我建议只有一个“用户”存储库。如果使用继承并在数据库级别跟踪用户类型,则不需要两个存储库类。

希望这有帮助。

享受!

答案 1 :(得分:1)

企业用户也可以成为客户吗?如果是这样,你会期望他们使用相同的ID吗?如果是这样,您可能希望查看实现Party-Role模式(也称为Actor-Participant)。

它将为您提供统一的解决方案,以处理内部用户角色以及公司与客户的区别。

第h

答案 2 :(得分:1)

也许我可以给你一些提示。我同意Doug的看法,你应该只使用一个管理User Aggregate类的UserRepository。

我就是这样做的(流利的)Nhibernate:

具有映射到单个列的UserType Enumeration字段的用户类。看到这篇文章,非常好,我已经多次使用过Jimmy Bogard的解决方案(http://lostechies.com/jimmybogard/2008/08/12/enumeration-classes/)。然后你有一个UserType类实际上只是将数据库表示为User表中的一列,但是你有一个带有Behavior等的完整类。

然后,为了解决每种类型应如何处理密码和客户关系的差异,您可以使用验证程序模式确认您的用户实例是有效的(基于您的UserType),然后再将其保存到db。看看这个博客http://lostechies.com/jimmybogard/2007/10/24/entity-validation-with-visitors-and-extension-methods/(吉米再次......我是否需要说你应该订阅Jimmy Bogard的博客:))。

然后你有一个UserPersistanceValidator来检查UserType是否是内部的,不需要pwd,必须提供AD角色。你得到了照片......

我希望这会对你有所帮助。祝你好运!