【问题标题】:User Factory and Repository用户工厂和存储库
【发布时间】:2011-04-18 19:42:44
【问题描述】:

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

我有两种类型的用户

  1. 企业内部用户
  2. 客户用户

它们在技术上的根本区别是

  1. 企业:不需要在系统中保存密码,只需要保存角色(针对 AD 的身份验证)
  2. 客户用户:在系统中保存密码并拥有一个关联的客户 ID。

我有一个表用户,其中有这样的列

User Name  
Password  
Roles  
Customer ID  

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

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

【问题讨论】:

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


    【解决方案1】:

    企业用户也可以是客户吗?如果是这样,您是否希望他们使用相同的 ID?如果是这样,您可能想看看实现Party-Role 模式(又名Actor-Participant)。

    它将允许您使用统一的解决方案来处理内部用户角色以及企业与客户的区别。

    第一次。

    【讨论】:

    • 没有。公司用户是与客户关联的用户 ID,以便客户可以登录系统。可能有多个用户 ID 与客户相关联。客户资料完全是单独的记录。
    【解决方案2】:

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

    希望这会有所帮助。

    享受吧!

    【讨论】:

    • 如果我们使用 nHibernate,hbm xml 会是什么样子?由于每种用户类型都有自己的一组字段。我们应该有 2 个不同的 hbm 文件,一个用于 CorporateUser,一个用于 CustomerUser,将相应的字段映射到同一个表?
    • @GeorgeKT - 我没有使用对象现实映射器的经验,并且更喜欢直接实现“存储库模式”以提高性能。可以在此处找到对存储库模式的良好描述 msdn.microsoft.com/en-us/library/ff649690.aspx - 希望这会有所帮助
    • 如果引进一种类型,我认为工厂会效仿
    【解决方案3】:

    也许我可以给你一些提示。我同意 Doug 的观点,即您应该只使用一个管理用户聚合类的 UserRepository。

    这就是我使用 (Fluent) Nhibernate 的方式:

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

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

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

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

    【讨论】:

    • 我明白了。非常感谢你 :) @Doug 也谢谢你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    相关资源
    最近更新 更多