域对象,POCO和实体有什么区别?

我在印象之下他们都基本一样。 模型对象是否也是一样的?

现在,在我的架构中,我有:

class Person { public string PersonId; public string Name; public string Email; public static bool IsValidName() { /* logic here */ } public static bool IsValidEmail() { /* logic here */ } } class PersonService { private PersonRepository pRepository; PersonService() { pRepository = new PersonRepository(); } public bool IsExistingEmail(string email) { //calls repo method to see if email is in db } public Person GetPerson(email) { return pRepository.Get(email); } public void SavePerson(Person p) { if (Person.IsValidEmail(p.Email) && !IsExistingEmail(p.Email) { pRepository.Save(p); } } } class PersonRepository { public void Save(Person p) { //save to db } public Person Get(string email) { //get from db } public bool IsExistingEmail(string email) { //see if email in db } } 

那么上面哪些类是POCODomain ObjectModel objectentity

我的(非标准)外行定义

  • POCO – Plain Old%Insert_Your_Language%Object。 一种没有逻辑的types。 它只是将数据存储在内存中。 你通常会看到它的自动属性,有时字段和构造函数。
  • Domain object与您的域相关的类的实例。 我可能会从域对象中排除任何卫星或实用程序对象,例如在大多数情况下,域对象不包括日志,格式化,序列化,encryption等内容 – 除非您专门构build产品以logging,序列化,格式化或encryption。
  • 我认为Model objectDomain object相同。 人们倾向于交替使用这个(我可能是错的)
  • Entity具有id的类
  • Repository从一侧(例如数据库,数据服务或ORM)到数据存储的一类,以及服务,UI,业务层或任何其他请求主体。 它通常隐藏所有与数据相关的东西(如复制,连接池,密钥约束,事务处理等),并且使得处理数据变得简单
  • Service软件通常通过公共API提供一些function。 根据图层,它可以是例如一个REST风格的独立容器,或者允许您查找所需types的特定实例的类。

原始答案

这些术语主要用于(分布式)域驱动devise。 他们不一样。 术语模型对象可以用作域对象的同义词。

域对象。 表示业务特定区域的对象,表示对领域专家有意义的东西。 域对象大多由实体和值对象表示。 一般来说,居住在领域层的大多数对象对模型有贡献,并且是领域对象。

实体。 一个对象从根本上不是由它的属性来定义的,而是由一连串的连续性和同一性所决定的。 (这意味着它必须Id

POCO。 一个简单的对象,没有复杂的逻辑,不需要被识别,通常它只有一些属性,用于ORM或作为数据传输对象

class Person – Entity和POCO,这个类的实例是Domain Object
class PersonService – 服务
class PersonRepository – 存储库

这更多的是function的内涵; 域对象是特定于您的逻辑实现的东西,可能比简单的POCO更复杂; 一个实体有一个内涵来表示某个东西(通常是指一个持久化媒介),一个POCO只是一个类的快速标识符。 模型只是用来表示一个对象(通常包含状态并且通常处理UI或DB)的术语。

这并不是说有任何function上的差异,它们只是用来更密切地描述某些东西的不同术语。 就像赛车,卡车和家庭轿车之间的区别。 都是汽车,但每个术语都更具描述性。

基本上归结为内部逻辑

  1. 域对象具有validation等内部域逻辑。
  2. 模型基本上是一个轻的Domain对象,他们知道他们拥有的数据,但没有真正的将如何使用
  3. 实体拥有数据,并具有内部知识来自何处,以及将要保存,更新的位置等
  4. POCO持有数据,可能有一些关于自己的内部知识,比如物业集合中所有物品的总价值是多less
  5. DTO是最简单的项目,它只是保存数据,没有逻辑

他们基本上都用于同样的事情,这只是你想要他们有多聪明

根据你的代码示例Person类将是一个域对象或模型,另外两个是一个服务和一个存储库。 使用域对象,Pocos,模型,dtos等,像消息从一层传递到下一层,像PersonService这样的服务类是应用程序中的一个层,和像PersonRepository这样的Repository类相同。 为了一个很好的观点,看看http://bob-the-janitor.blogspot.com/2009/07/n-tier-design-revisit-part-1-over-view.html在这种情况下,它是在谈论使用一个基本上是dto的数据实体;

上面的答案中已经有了很好的解释。

在数据库上下文中,实体是指实体关系模型ERD中的项目 。 (即表中的一行)

在Microsoft-Dotnet-EntityFramework-World Entity中意味着可以使用数据(基本)上下文从数据库加载并保存到数据库的对象。 通常,一个实体在没有其数据(基本)上下文的情况下不能存在。 (Unit-)testing这些类的业务function是困难的。

Pocos(Plain Old CommonRuntime对象)可以在没有PersistenceFramework(EntityFramework或NHibernate)的情况下存在,因此它们更容易testing。

poco这个词是由于同样的原因在java世界中创build的pojo(普通的旧Java对象)的适配 。

只是一个devise提示。

而不是使用:

 class PersonService { private PersonRepository pRepository; PersonService() { pRepository = new PersonRepository(); } } 

使用:

 class PersonService { private PersonRepository pRepository; PersonService(PersonRepository pRepository) { this.pRepository = pRepository; } } 

为PersonService提供dependency injection。

域对象是应用程序域层中的一个实体,例如。 地址类。 “模型”意味着同样的事物 – “域模型”中的一个实体。

POCO(普通的旧CLR对象)是没有定义行为(方法)的对象,只包含数据(属性)。 POCO通常用作DTO(数据传输对象)在层之间传输数据,然后数据通常用于填充域对象/实体。