我觉得他们基本上都是一样的。模型对象也一样吗?
现在,在我的架构中,我有:
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
}
}
以上哪个类别为POCO
,Domain Object
,Model object
,entity
?
答案 0 :(得分:85)
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)
基本上归结为内部逻辑
它们基本上都用于同一件事,它只是你想要它们多么聪明
根据您的代码示例 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(数据传输对象)来在层之间传输数据,然后数据通常用于填充域对象/实体。