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

时间:2011-05-27 15:20:24

标签: c# asp.net architecture domain-driven-design

我觉得他们基本上都是一样的。模型对象也一样吗?

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

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

6 个答案:

答案 0 :(得分:85)

我的(非标准)Layman定义

  • POCO - 普通旧%Insert_Your_Language%对象。一种没有逻辑的类型。它只是将数据存储在内存中。您通常只会在其中看到自动属性,有时是字段和构造函数。
  • Domain object与您的域相关的类的实例。我可能会从域对象中排除任何卫星或实用程序对象,例如在大多数情况下,域对象不包括日志记录,格式化,序列化,加密等内容 - 除非您专门构建产品以分别进行日志,序列化,格式化或加密。
  • Model object我认为与Domain object相同。人们倾向于互换地使用它(我可能是错的)
  • Entity一个有id
  • 的班级
  • Repository一个类,它从一侧(例如数据库,数据服务或ORM)向服务,UI,业务层或任何其他请求主体说明数据存储。它通常会隐藏所有与数据相关的东西(比如复制,连接池,键约束,事务等),并且只是简单地处理数据
  • Service软件,通常通过公共API提供某些功能。根据层的不同,它可以是一个RESTful自包含容器,或者允许您查找所需类型的特定实例的类。

原始答案

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

域对象。来自业务特定区域的对象,代表对域专家有意义的内容。域对象主要由实体和值对象表示。通常来说,生活在域层中的大多数对象都对模型有贡献,并且是域对象。

实体。从根本上定义的对象不是由其属性定义,而是由连续性和标识的线程定义。 (意思是必须 ID

POCO。一个没有复杂逻辑的简单对象,通常它只有一些属性,可以与ORM一起使用或作为数据传输对象使用

class Person - 实体和POCO,此类的实例是域对象
class PersonService - 服务
class PersonRepository - 存储库

答案 1 :(得分:18)

它更多的是功能的内涵;域对象是特定于逻辑实现的东西,可能比简单的POCO更复杂;实体具有表示某事物的内涵(通常参考持久性媒介),而POCO只是一个类的快速标识符。模型只是用于表示对象的术语(通常包含状态,通常处理UI或DB)。

并不是存在任何功能差异,它们只是用不同的术语来更接近地描述某些东西。喜欢赛车,卡车和家庭轿车之间的区别。所有都是汽车,但每个术语都更具描述性。

答案 2 :(得分:13)

基本上归结为内部逻辑

  1. 域对象具有内部域逻辑,如验证等。
  2. 模型基本上是一个轻型域对象,他们知道他们持有的数据,但没有真正关于它将如何使用
  3. 实体持有数据,并对其来源以及保存,更新等方面有一些内部了解。
  4. POCO持有数据,可能有一些关于它自身的内部知识,比如属性集合中所有项目的总价值。
  5. DTO是最简单的项目,它只保存数据并且没有逻辑
  6. 它们基本上都用于同一件事,它只是你想要它们多么聪明

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

答案 3 :(得分:9)

在上面的答案中已经很好地解释了域和模型。

在数据库中 - 上下文实体表示Entity Relationship Model ERD中的项目。 (即表中的一行)

Microsoft-Dotnet-EntityFramework-World实体中,意味着可以使用数据(基础)上下文从数据库加载并保存到数据库的对象。通常,没有数据(基础)上下文,实体就不可能存在。 (单位 - )测试这些类的业务功能是困难的。

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

poco这个词是由于同样的原因在java世界中创建的pojo (plain old java object)的适应性。

答案 4 :(得分:5)

只是一个设计提示。

而不是使用:

class PersonService
{
    private PersonRepository pRepository;

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

使用:

class PersonService
{
    private PersonRepository pRepository;

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

向PersonService提供依赖注入。

答案 5 :(得分:2)

域对象是应用程序的域层中的实体,例如。地址类。 “模型”意味着相同的东西 - “领域模型”中的实体。

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