C#类库 - 设计缺陷在哪里以及如何解决它

时间:2012-01-24 09:55:54

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

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

用户

  • 用户名

  • 公司

  • 项目List<Projects>

项目

  • 项目名

  • 资源List<Resource>

  • 项目负责人User

资源

  • RESOURCEID

  • 专案编号

  • ReportingHead User

你一定已经找到了这个漏洞但是,正如你所看到的ReportingHead,ProjectLead已经是用户类,这使得它可以查询有关它们的项目的信息,这将导致另一个周期检索项目的用户。

即使资源与项目相关联,我也必须添加一个属性projectId(首先它是类型项目),因为我有一个IResourceRepository为项目创建资源,该项目将返回{{1 }}。如何设计课程以使其有意义?

1 个答案:

答案 0 :(得分:1)

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

What's an Aggregate Root?

将您的某个实体确定为root,然后尝试查看它是否适合您的方案。我举个例子。如果不知道你的场景,这很难,所以把它看作一个例子:

我选择Companyas聚合根。

Company
  Name:string
  Projects:IList<Project>

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

Resource
  Employee:Employee
  (ResourceType probably)

Employee
  Name

(Ids被遗漏但如果你想要DB Persist,可能会在某个基类中)

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

您可以随意使用某种您认为无法处理的方案攻击此设计,我会编辑我的帖子。