C#类库-设计缺陷在哪里?如何解决
在我创建的典型组织应用程序中,存在实体C#类库-设计缺陷在哪里?如何解决,c#,oop,design-patterns,code-organization,C#,Oop,Design Patterns,Code Organization,在我创建的典型组织应用程序中,存在实体用户,项目,公司,联系人。对于下面定义的用户类,我想我将使用循环依赖我应该如何修改下面的类以解决问题 使用者 用户名 公司 项目列表 项目 项目名称 资源列表 项目负责人用户 资源 足智多谋的 投射 报告头User 您必须已经找到该缺陷,但是正如您所看到的,ProjectLead已经是用户类,这使得它可以为他们查询有关项目的信息,这将导致另一个周期来检索他们项目的用户 即使资源与项目相关联,我也必须添加一个属性projectId
用户
,项目
,公司
,联系人
。对于下面定义的用户类,我想我将使用循环依赖我应该如何修改下面的类以解决问题
使用者
- 用户名
- 公司
- 项目
列表
- 项目名称
- 资源
列表
- 项目负责人
用户
- 足智多谋的
- 投射
- 报告头
User
即使资源与项目相关联,我也必须添加一个属性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递归地填充整个数据结构,那么他可能会陷入无限循环(和堆栈溢出)。缓存层应该可以防止这种情况发生?公司作为聚合如何。项目、资源、客户都属于它。现在,层次结构将看起来像他公司下的用户,该公司现在将包含项目,并将继续。因为我得到了一个列表
,所以我会使用谓词匹配来查找合适的用户、项目和资源,这完全取决于您的场景。我把公司看作一个简单的对象,只是为了描述用户在哪里工作(顾问)。但是,如果应用程序以公司为中心,并处理他们的项目,公司就完全有道理了。也许用户实际上是雇员?是的,用户就是雇员。我会马上给你一份样品证明,然后在这里报告。马克会尽快回答:)谢谢