我决定是否应该使用富域模型而不是贫穷领域模型,并寻找两者的好例子.
我一直使用Anemic Domain Model构建Web应用程序,由Service - > Repository - > Storage层系统支持,使用FluentValidation进行BL验证,并将我的所有BL放在Service层中.
我读过Eric Evan的DDD书,他(以及Fowler和其他人)似乎认为Anemic Domain Models是一种反模式.
所以我真的很想了解这个问题.
此外,我真的在寻找一个富域模型的好(基本)示例,以及它提供的贫血域模型的好处.
我偶然发现了以下两篇文章第一和第二篇,其中作者总结说ORM实体和域实体不应混淆.
我正好面对这个问题,因为我使用Code First方法使用EF 6.0进行编码.我使用POCO类作为EF中的实体以及我的域/业务对象.但我经常发现自己经常将属性定义为public或导航属性为virtual,因为EF Framework强迫我这样做.
我不知道该怎么采取这两篇文章的底线?我是否真的应该为实体框架创建一个CustomerEF类,为我的域创建一个CustomerD.然后创建一个使用CustomerD的存储库将它映射到CustomerEF做一些查询,然后将收到的CustomerEF映射回CustomerD.我认为EF就是将我的域实体映射到数据.
所以请给我一些建议.我是否忽略了EF能够为我提供的重要事项?或者这是EF无法完全解决的问题?在后一种情况下,管理这个问题的好方法是什么?
我一直在阅读有关域驱动设计以及如何使用代码优先方法生成数据库的方法.根据我的阅读和研究,围绕这个主题有两种观点:
有1个类同时用作域模型和持久性模型
有2个不同的类,一个实现域逻辑,一个用于代码优先方法
现在我知道意见1)据说简化了在域和持久性模型之间没有太多差异的小解决方案,但我认为它打破了单一责任原则,并且当ORM的约定干扰DDD时引入了许多问题.
令我感到意外的是,有很多关于如何实现意见的代码示例1).但是还没有找到一个如何实现意见的例子2)以及如何映射这两个对象.(可能有这样的例子,但我找不到C#)
所以我试着自己实现一个例子,但我不确定这是不是一个很好的方法.
假设我有一个票务系统,票证有到期日.我的域名模型如下所示:
/// <summary>
/// Domain Model
/// </summary>
public class TicketEntity
{
public int Id { get; private set; }
public decimal Cost { get; private set; }
public DateTime ExpiryDate { get; private set; }
public TicketEntity(int id, decimal cost, DateTime expiryDate)
{
this.Id = id;
this.Cost = cost;
this.ExpiryDate = expiryDate;
}
public bool IsTicketExpired()
{
if (DateTime.Now > this.ExpiryDate)
{
return true;
}
else
{
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用Entity …
为了利用java.util.streamJdk 8中包含的各种查询方法,我尝试设计域模型,其中具有*多重性(具有零个或多个实例)的关系的getter 返回a Stream<T>而不是Iterable<T>or Iterator<T>.
我怀疑的是,与此Stream<T>相比,Iterator<T>是否会产生任何额外的开销?
那么,使用Stream<T>?来破坏我的域模型是否有任何不利之处?
或者,我应该总是返回一个Iterator<T>或者Iterable<T>,并通过将该迭代器转换为StreamUtils?来让最终用户决定是否使用流.
请注意,返回a Collection不是有效选项,因为在这种情况下,大多数关系都是惰性且大小未知.
我在工作中讨论过"域模型中的继承使开发人员生活变得复杂".我是OO程序员,所以我开始寻找在域模型中具有继承性的论据,这样可以简化开发人员的生活,而不是让交换机遍布整个地方.
我想看到的是:
class Animal {
}
class Cat : Animal {
}
class Dog : Animal {
}
Run Code Online (Sandbox Code Playgroud)
另一位同事说的是:
public enum AnimalType {
Unknown,
Cat,
Dog
}
public class Animal {
public AnimalType Type { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我如何说服他(链接是欢迎的)一个类层次结构比在这种情况下具有枚举属性更好?
谢谢!
我一直在阅读有关将业务逻辑放在ASP.NET MVC项目中的位置,我仍然无法弄清楚某些事情.
1 - 领域模型.这些真的是什么?在我的Model文件夹中,我只有一堆与我的数据库对应的类.我先使用EF代码.我认为这些是我的域模型.
2 - 服务层.这个答案暗示了一个服务层,我觉得这很有道理.我决定和这个一起去.然而,Martin Fowler的"贫血领域模型"文章搞砸了我的想法.
我不确定如何为我的域模型添加逻辑.
我经历了许多与业务逻辑相关的问题,每个问题都提出了1或2.我不明白的是我如何实现第一个问题.向实体类添加方法(对我来说是域模型)根本没有意义.为什么第二种方法被认为是坏的?
asp.net-mvc business-logic domain-model service-layer anemic-domain-model
顺便说一下 - 参考数据建模,我指的是逻辑或概念数据模型 - 而不是物理模型.
工作中的讨论提出了这个问题; 我自然而然地跳到维基百科以获得一些基本的定义 - 希望他们可以澄清差异 - 但他们没有......
概念模式或概念数据模型是概念及其关系的映射.
逻辑数据模型看起来非常相似(根据此定义):
一个逻辑数据模型的系统工程(LDM)是一个组织的数据,在术语实体和关系来组织的代表和独立于任何特定的数据管理技术.
其中,作为...
解决问题和软件工程中的域模型或域对象模型(DOM)可以被认为是描述该系统中涉及的各种实体及其关系的系统的概念模型.
领域模型与概念数据模型之间的差异似乎特别模糊.
增加这种混淆的一个原因是(从我所看到的)域模型通常使用UML类图建模 - UML类图中的类实体支持方法 - 我们的同事坚持认为域模型必须不包含"操作".我可以使用UML类图的子集来理解域建模器 - 但假设人们在使用它们所使用的工具支持它时不会包含"操作"并不危险吗?
好吧,我一直试图找出数据映射器和存储库之间的区别,但到目前为止我还没有.在我看来,专家程序员说"存储库是查询构造代码集中的映射层的另一个抽象层".这似乎可以理解,但仍然有点抽象.我之前读过stackoverflow上的这篇文章,它让我更加困惑: Data Mapper模式与存储库模式有何不同?
我想我需要的是关于两种模式如何不同的简单解释和具体/实际示例,以及数据映射器不具备的存储库,反之亦然.你们中的任何人都知道一个关于说明数据映射器和存储库概念的好例子吗?如果它是相同的示例,只有一个使用数据映射器而另一个使用存储库会更好.谢谢,我非常感谢.到目前为止我仍然很困惑......
我正在构建一个ORM,并试图找出每个模式的确切职责.假设我想在两个帐户之间转移资金,使用工作单元来管理单个数据库事务中的更新.以下方法是否正确?
例:
from = acccountRepository.find(fromAccountId);
to = accountRepository.find(toAccountId);
unitOfWork.attach(from);
unitOfWork.attach(to);
unitOfWork.begin();
from.withdraw(amount);
to.deposit(amount);
unitOfWork.commit();
Run Code Online (Sandbox Code Playgroud)
应该像在这个例子中那样独立使用工作单元和存储库,或者:
欢迎所有评论!
orm domain-driven-design unit-of-work repository-pattern domain-model
domain-model ×10
orm ×4
java ×2
architecture ×1
asp.net-mvc ×1
c# ×1
datamapper ×1
enums ×1
inheritance ×1
java-8 ×1
java-stream ×1
modeling ×1
oop ×1
repository ×1
unit-of-work ×1