C#业务对象和集合

Mat*_*hew 6 .net c# business-logic business-objects

我很难绕过业务对象或更具体地说是业务对象集合.

这是我正在尝试做的一个简单示例.

如果我有一个事件对象,则此对象可以包含许多人,并且每个Person对象都可以有多个注释.没有Person对象,Notes不能存在,如果没有Incident对象,Person对象就不能存在.

如果我有公共列表<Note> notes = new List <Note>(),则事件中的Person可以使用ADD和REMOVE等方法.我假设如果我要在Notes集合上调用这些方法,它将只是从列表中删除它,但不执行任何代码来实际添加/更新/删除数据源中的员工.这让我相信我不应该使用List而是其他什么?

这也引出了另一个问题.实际数据库CRUD操作应驻留在何处.Note对象是否应该有自己的CRUD,或者Person对象应该对它负责,因为它没有它就不存在?

我有点迷失方向,我想让这部分正确,因为它将成为该计划其余部分的模板.

Jon*_*onH 1

已经提供了一些重要信息,但您提到的一件事可能会让您感到困惑:

“如果我有公共列表注释 = new List(),则事件中的人员可以使用 ADD、REMOVE 等方法。”

这一切都取决于您如何设计课程。您应该考虑的一件事是这些数据相互关联的方式。这将帮助你想象你的班级设计。

听起来像下面这样:

  • 一件事情可能涉及很多人
  • 一个人可以创建很多笔记
  • 注释是最低级别,由于事件的创建和处理该事件的负责人而存在。

事件 1 - 多人

第一个人 - 许多笔记

您可以通过多种方式建立这种类型的关系。一种方法可能是实际分离所涉及的对象,然后创建连接的对象。

例如

public class Incident {
//insert incident fields here
//do not add person logic / notes logic
//probably contains only properties
}

public class Person {
//insert person fields
//private members with public properties
//do not embed any other logic
}

public class Comment {
 //insert comment private fields
 //add public properties
 //follow the law of demeter
}
Run Code Online (Sandbox Code Playgroud)

这些类不会互相提供详细信息,它们只是存储这些信息的存储库。然后,您可以将这些类彼此关联起来

public class IncidentPersonnel {
List<Person> p;
//add methods to add a person to an incident
//add methods to remove a person from an incident
....
}
Run Code Online (Sandbox Code Playgroud)

然后你可能有另一个类来处理人员的评论

public class PersonnelNotes {
List<Note> n;
//other methods...
}
Run Code Online (Sandbox Code Playgroud)

您可以进一步解决这个问题,但这可能会使事情变得复杂,但我只是给您提供如何处理这个问题的另一个想法。

尝试遵循函数的迪米特定律

封装所有的对象,此外,你的邻居可以与你交谈,但不能做太多其他事情......这将有助于保持你的类松散耦合,并使你的思维过程更简单。

最后,您提到了 CRUD 操作应该如何工作。这一切都回到您的DAL(数据访问层)。您可以返回一个引用的对象及其所有属性,而不是从表中返回数据行。添加和删​​除的工作方式相同(传入或传出对象)。您可以使用 ORM 或编写自己的 DAL。这完全取决于您想要自己参与的程度:)。