如何在实现值对象(作为地址的规范示例)作为不可变对象或结构之间进行选择?
选择一个是否具有表现,语义或任何其他好处?
有人能指出我在.NET平台上开发的"完整"DDD示例.我觉得大多数例子都"不完整".
我真的很想看到DDD原则在起作用.
我80%肯定我不应该问这个问题,因为它可能会被认为是否定的,我的意思是不会对任何人不尊重,特别是本书的作者.我看过几篇推荐本书及其配套项目的帖子.我没看过这本书,但今天我花了几个小时研究这个项目.虽然看起来非常完整,但我很难分清各种各样的细节.我在自己的设计中苦苦挣扎,如果一个实体发生变化,我必须改变多少,而这个项目并没有让我感到非常舒服.
例如,有一个继承自Person的Employee对象.Person有一个带有名字,姓氏等的构造函数,因此Employee也是如此.私人雇员是名字,姓氏和公共财产的成员.
有一个EmployeeFactory,它知道Employee和Person属性,以及SQL列名称(从读取器中提取值).
有一个带有未实现的PersistNewItem和PersistUpdatedItem方法的EmployeeRepository我怀疑,如果实现的话,将为INSERT和UPDATE语句构建SQL,就像我在CompanyRepository中看到的那样.这些将属性写入字符串以构建SQL.
有一个'数据契约'PersonContract具有与Person相同的私有成员和公共属性,而EmployeeContract继承自PersonContract,如Employee,Person,具有镜像实体的公共属性.
有一个静态的"Converter"类,其中包含将实体映射到Contracts的静态方法
EmployeeContract ToEmployeeContract(Employee employee)
Run Code Online (Sandbox Code Playgroud)
它将字段从一个复制到另一个,包括Person字段.可能有另一种方式的伴侣方法 - 不确定.
我认为也有单元测试.
总而言之,我计算了5-10个类,方法和构造函数,其中包含有关实体属性的详细知识.也许他们是自动生成的 - 不确定.如果我需要向Person添加"Salutation"或其他属性,我将不得不调整所有这些类/方法?我确定我会忘记一些事情.
同样,我的意思是没有不尊重,这似乎是本书的一个非常详尽的例子.这是DDD的完成方式吗?
以前曾问过类似的问题,但不完全相同(除非我错过了)
我想通过我的服务,域,域事件,域事件处理程序传递IUserInfo类实例...
什么是最好的方法.
我是不是该
使用IoC通过将其注册到Httpcontext.Current.session ["CurrentUser"]的实例来注入它;
将数据添加到当前线程.
任何其他方式
我被困在域事件处理程序中,我想使用这些数据进行审计以及发送电子邮件.
我希望能够在我的应用程序中的任何位置使用CurrentUser信息.
随着线程被合并的线程,我怀疑线程的重用是否会重置数据.如果没有,请告诉我如何使用线程传递IUser实例.
问候,
损伤
如果这是重复,我道歉,但我在相关问题中找不到关于该主题的任何具体示例.
在阅读了Martin Fowler关于"贫血领域模型"的文章之后,我不知道为什么这被认为是一种反模式.大多数企业开发人员甚至认为它是一种反模式,因为AFAIK可能有90%的j2ee应用程序是以"贫血"方式设计的?
有人可以推荐进一步阅读这个主题(除了"领域驱动设计"一书),或者甚至更好,给出一个具体的例子来说明这种反模式如何以一种糟糕的方式影响应用程序设计.
谢谢,
java architecture domain-driven-design anti-patterns anemic-domain-model
我正在为即将到来的内部应用程序设置一个项目结构,该应用程序试验了Palermo提出的Onion Architecture(http://jeffreypalermo.com/blog/the-onion-architecture-part-3/).
我遵循他的指导方针,但到目前为止我需要对项目结构进行一些验证.
在图表之前,问题:
我认为参考文献都是正确的(根据图表设置箭头表示'引用'),但有些验证会很好.
我应该在依赖性解析层中添加什么?这是帮助者去的地方吗?这引用了所有其他项目?
Web服务和UI如何与DAL通信?(通过核心?怎么样?)
应该去哪里?[我知道的广泛问题......]
简化的概念图如下(文件夹代表名称空间):

public class Person
{
public IList<String> SpecialBirthPlaces;
public static readonly DateTime ImportantDate;
public String BirthPlace {get;set;}
public DateTime BirthDate
{
set
{
if (BirthPlace!=null &&
value < ImportantDate &&
SpecialBirthPlaces.Contains(BirthPlace))
{
BirthPlace = DataBase.GetBirthPlaceFor(BirthPlace, value);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是尝试在我的域模型中封装一个简单的规则.我试图捕获的规则是:当出于某种原因,我们更新一个人的出生日期(例如,原始用户输入中存在错误)时,我们需要检查该人的出生地并将其替换为来自其他人的其他值.数据库,如果它在我们的数据库中列为特殊的出生地.
但是,我实现它有两个问题:
此规则修改域实体状态(属性),我需要在用户界面中反映此更改.我的域名模型是POCO.我可以把这个逻辑放在ViewModel中,但这是错误的,因为它不是UI逻辑.这是我需要捕获的一个重要的域规则.
我的SpecialBirthPlaces列表非常大,每次我从数据库中获取客户时我都不想填充它.此外,当规则得到满足时,我需要替换Birthplace.正如我所说,特殊的出生地和替代品的列表非常大,并存储在数据库中.
如何在DDD风格中实现我需要的逻辑?
埃里克在他的书中很少涉及模块的主题.他也没有谈到模块结构与有界上下文的关系和例子.有界上下文是否包含包含有界上下文的模块或模块?当应用程序有DDD时,它可以扩展多么容易?
在设计可扩展应用程序时,应用程序的结构非常重要.Microsoft MEF框架可以从dll自动发现模块/组件.
让我们举个例子.在电子商务应用程序中,我们可以为付款处理提供有限的上下文.付款处理可以是抽象的,因此我可以稍后使用Paypal或Payflow等更多支付处理器扩展应用程序.目前我只有Paypal,几个月后我想整合Payflow.为了集成Payflow,我可以有一个程序集(一个dll)来实现支付处理的接口.我可以在应用程序中删除该DLL,MEF将自动发现它.
这里的挑战是,为PayFlow支付处理创建的DLL是一个模块,而不是有界上下文(BC).如果我将其创建为BC,我们有两个用于支付处理的 BC .(BC为Paypal创建,BC为Payflow创建).如果我们使用Bounded Context中的模块和Bounded Context作为程序集(dll)构建应用程序,那么模块可以作为文件夹而不是程序集驻留在BC中(您可以将其视为在Visual Studio中创建的C#库).
我们如何使用DDD处理这种可扩展性问题?为支付处理,卑诗省和不同的文件夹它下面的模块,一个贝宝等......还是我们需要子BC另一BC里面?
如果我的问题很天真,我会倾向于DDD,所以道歉.我想我需要使用本地数据传输对象才能向用户显示数据,因为许多属性不属于任何实体/值对象.
但是,我不确定应该在域域层或应用程序服务层中实现此DTO的位置.DTO实现似乎是域的一部分,但这意味着当我在服务层中创建DTO集合并将其传递给表示层时,我必须在表示层中引用域层,这似乎是错误的.
使用DDD原则实现DTO的正确方法是什么?
在DDD中,存储库加载整个聚合 - 我们要么加载所有聚合,要么加载所有聚合.这也意味着应该避免延迟加载.
我关心的是表现方面.如果这会导致数千个对象加载到内存中会怎样?例如,一个聚合Customer回来了一万Orders.
在这种情况下,这是否意味着我需要重新设计并重新考虑我的聚合?DDD是否就此问题提出建议?