【问题标题】:C# Class Library - Where is design flaw and How do i solve itC# 类库 - 设计缺陷在哪里以及如何解决它
【发布时间】:2012-01-24 09:55:54
【问题描述】:

在我创建的典型组织应用程序中,存在 User,Projects,Company,Contacts 实体。对于下面定义的用户类,我想我会遇到循环依赖。 我应该如何修改下面的类来解决问题。

用户

  • 用户名

  • 公司

  • 项目List<Projects>

项目

  • 项目名称

  • 资源List<Resource>

  • 项目负责人User

资源

  • 资源ID

  • 项目编号

  • 报告负责人User

你一定已经发现了这个缺陷,但是,正如你所看到的ReportingHead,ProjectLead 已经是 User 类,这使得它可以为他们查询有关项目的信息,这将导致另一个循环来检索项目的用户。

即使资源与项目相关联,我也必须添加一个属性 projectId(首先它是项目类型),因为我有一个 IResourceRepository 来为将返回 Resource 实例的项目创建资源。现在应该如何设计该类以使其有意义?

【问题讨论】:

  • 问题出在哪里?我什么都没看到!你可以有两种方式的依赖。
  • @DanielHilgarth 浏览了这个案例。我查询用户 daniel 我会得到他的项目列表,每个项目都会有项目负责人、资源(这反过来有报告负责人)。 ProjectHead、ReportingHead 是 User 类,因此,为了填写他们的详细信息,我将不得不查询 Projects,这些 Projects 又将落在第 1 点。
  • 正如我所说,这不是问题......试试吧。但是,我想知道您是否在像 NHibernate 这样的 ORM 上下文中提出这个问题,因为您正在谈论“查询”的东西。
  • 我同意丹尼尔的观点,这可能会奏效。但是imo你应该尽量不要有双向关系,只要它是合理的可能。它以多种方式为您提供更简洁的代码。
  • @Daniel Hilgarth:如果 OP 递归地填充整个数据结构,他可能会陷入无限循环(和堆栈溢出)。缓存层应该防止这种情况发生吗?

标签: c# oop design-patterns code-organization


【解决方案1】:

您可以花一些时间阅读聚合和聚合根。

What's an Aggregate Root?

确定您的一个实体作为根并尝试看看它是否适合您的场景。我给你一个例子。在不了解您的场景的情况下,这非常困难,因此请将其视为示例:

我选择 Companyas 聚合根目录。

Company
  Name:string
  Projects:IList<Project>

Project
  ProjectName:string
  Resources:IList<Resource>
  Projecthead:Employee

Resource
  Employee:Employee
  (ResourceType probably)

Employee
  Name

(ID 被省略,但如果你想 DB Persist 可能会在某个基类中)

现在您必须确保您只能通过根公司访问此聚合根。 这是关于隔离的,你不能再使用像 user.GetAllMyProjects() 这样的方法感觉很奇怪,但这会让你以后更容易。 相反,您可以创建一个类似 project.HasGivenUserAccess(User user) 的方法。那可能就足够了,但这取决于您的情况。

随意用一些你认为它无法处理的场景来攻击这个设计,我会编辑我的帖子。

【讨论】:

  • Company 怎么样。项目、资源、客户属于它。现在层次结构看起来像他公司下的用户,现在将包含项目并且它会继续。因为我得到了List&lt;&gt;,所以我会使用谓词匹配来找到合适的用户、项目、资源
  • 当然,这完全取决于您的场景。我将公司视为一些简单的对象,仅用于描述用户在哪里工作(顾问)。但是,如果应用程序以公司为中心并处理他们的项目,那么公司就完全合理了。也许用户实际上是员工?
  • 是的,用户是员工。我将立即验证样本证明并在这里报告。将很快标记为答案:) 谢谢
猜你喜欢
  • 1970-01-01
  • 2017-05-16
  • 2021-05-01
  • 1970-01-01
  • 2022-10-25
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 2014-06-24
相关资源
最近更新 更多