Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#类库-设计缺陷在哪里?如何解决_C#_Oop_Design Patterns_Code Organization - Fatal编程技术网

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

C#类库-设计缺陷在哪里?如何解决,c#,oop,design-patterns,code-organization,C#,Oop,Design Patterns,Code Organization,在我创建的典型组织应用程序中,存在实体用户,项目,公司,联系人。对于下面定义的用户类,我想我将使用循环依赖我应该如何修改下面的类以解决问题 使用者 用户名 公司 项目列表 项目 项目名称 资源列表 项目负责人用户 资源 足智多谋的 投射 报告头User 您必须已经找到该缺陷,但是正如您所看到的,ProjectLead已经是用户类,这使得它可以为他们查询有关项目的信息,这将导致另一个周期来检索他们项目的用户 即使资源与项目相关联,我也必须添加一个属性projectId

在我创建的典型组织应用程序中,存在实体
用户
项目
公司
联系人
。对于下面定义的用户类,我想我将使用循环依赖我应该如何修改下面的类以解决问题

使用者
  • 用户名

  • 公司

  • 项目
    列表

项目
  • 项目名称

  • 资源
    列表

  • 项目负责人
    用户

资源
  • 足智多谋的

  • 投射

  • 报告头
    User

您必须已经找到该缺陷,但是正如您所看到的,ProjectLead已经是用户类,这使得它可以为他们查询有关项目的信息,这将导致另一个周期来检索他们项目的用户


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

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

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

我选择公司的总根

Company
  Name:string
  Projects:IList<Project>

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

Resource
  Employee:Employee
  (ResourceType probably)

Employee
  Name
公司
名称:string
项目:IList
项目
项目名称:字符串
资源:IList
项目负责人:员工
资源
雇员:雇员
(可能是资源类型)
雇员
名称
(省略了ID,但如果希望DB持久化,可能会在某些基类中)

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


请随意使用一些您认为它无法处理的场景来攻击此设计,我将编辑我的帖子。

问题出在哪里?我没看见!您可以有这样的双向依赖关系。@DanielHilgarth将详细介绍此案例。我查询用户daniel,我会得到他的项目列表,每个项目都有projectlead和resource(后者又有报告头)。ProjectHead,ReportingHead是用户类,所以,为了填写他们的详细信息,我必须查询项目,这些项目将依次进入第1点。正如我所说的,这不是一个问题。。。试试看。然而,我想知道你是否在像NHibernate这样的ORM环境中问这个问题,因为你在谈论“查询”的东西。我同意Daniel的观点,这可能会起作用。但在我看来,只要合理,你就应该尽量避免双向关系。丹尼尔·希尔加思:如果OP递归地填充整个数据结构,那么他可能会陷入无限循环(和堆栈溢出)。缓存层应该可以防止这种情况发生?公司作为聚合如何。项目、资源、客户都属于它。现在,层次结构将看起来像他公司下的用户,该公司现在将包含项目,并将继续。因为我得到了一个
列表
,所以我会使用谓词匹配来查找合适的用户、项目和资源,这完全取决于您的场景。我把公司看作一个简单的对象,只是为了描述用户在哪里工作(顾问)。但是,如果应用程序以公司为中心,并处理他们的项目,公司就完全有道理了。也许用户实际上是雇员?是的,用户就是雇员。我会马上给你一份样品证明,然后在这里报告。马克会尽快回答:)谢谢