DDD实体利用服务我的实体有一些业务逻辑,使用我目前在某些领域服务中的一些财务计算和费率计算,以及一些我放在值对象中的常量值。我正在努力解决如何让实体在领域服务中使用逻辑,或者这些服务中的逻辑是否属于那里。这是我到目前停止:publicclassTicket{publicTicket(intid,ConstantRatesconstantRates,FinancialCalculationServicef,RateCalculationServicer){Id=id;ConstantRates=constantRates;财务计算器=f;利率计算器=r;}privateFinancialCalculationServiceFinancialCalculator{get;放;}privateRateCalculationServiceRateCalculator{get;放;}privateConstantRatesConstantRates{get;放;}publicintId{得到;私有集;}publicdoubleProjectedCosts{get;放;}publicdoubleProjectedBenefits{get;放;}publicdoubleCalculateFinancialGain(){vardiscountRate=RateCalculator.CalculateDiscountRate(ConstantRates.Rate1,ConstantRates.Rate2,ConstantRates.Rate3);返回FinancialCalculator.CalculateNetPresentValue(discountRate,new[]{ProjectedCosts*-1,ProjectedBenefits});}}publicclassConstantRates{publicdoubleRate1{get;放;}publicdoubleRate2{get;放;}publicdoubleRate3{get;放;}}公共类RateCalculationService{publicdoubleCalculateDiscountRate(doublerate1,doublerate2,doublerate3){//做一些jibbajabbareturn8.0;}}publicclassFinancialCalculationService{publicdoubleCalculateNetPresentValue(doublerate.params.valuesdouble[]MicrosoftFinancial.NPV(rate,refvalues);}}我觉得有些计算逻辑确实属于那些领域服务,但不我真的不喜欢我必须从我的存储库中手动注入这些依赖项是否有另一种可以建模的方法?我不喜欢吗?读过蓝皮书但之前没有真正用这种风格构建任何东西,我是寻找指导。编辑感谢大家的反馈!根据我所听到的,听起来我的模型应该更像下面这样。这样看起来更好?publicclassTicket{publicTicket(intid){Id=id;}privateConstantRatesConstantRates{get;放;}publicintId{得到;私有集;}publicdoubleProjectedCosts{get;放;}publicdoubleProjectedBenefits{get;放;}publicdoubleFinancialGain{get;放;}}publicclassConstantRates{publicdoubleRate1{get;放;}publicdoubleRate2{get;放;}publicdoubleRate3{get;放;}}publicclassFinancialGainCalculationService{publicFinancialGainCalculationService(RateCalculationServicerateCalculator,FinancialCalculationServicefinancialCalculator,ConstantRateFactoryrateFactory){RateCalculator=rateCalculator;财务计算器=财务计算器;速率工厂=速率工厂;}privateRateCalculationServiceRateCalculator{get;放;}privateFinancialCalculationServiceFinancialCalculator{get;放;}privateConstantRateFactoryRateFactory{get;放;}publicvoidCalculateFinancialGainFor(Ticketticket){varconstantRates=RateFactory.Create();vardiscountRate=RateCalculator.CalculateDiscountRate(constantRates.Rate1,constantRates.Rate2,constantRates.Rate3);ticket.FinancialGain=FinancialCalculator.CalculateNetPresentValue(discountticket.new[]*-1,ticket.ProjectedBenefits});}}publicclassConstantRateFactory{publicConstantRatesCreate(){returnnewConstantRates();}}publicclassRateCalculationService{publicdoubleCalculateDiscountRate(doublerate1,doublerate2,doublerate3){//做一些jibbajabbareturn8.0;}}publicclassFinancialCalculationService{publicdoubleCalculateNetPresentValue(doublerate,paramsdouble[]values){returnMicrosoft.VisualBasic.Financial.NPV(rate,refvalues);领域模型在这一点上它最终变得相当贫血,但随着我添加功能它可能具有更多功能编辑2好的我得到了更多反馈,也许我的“计算”服务更像是一个策略对象,我的实体可以依赖在上面。这是实体的更多逻辑和使用这些策略对象的另一种看法。对此有何想法?直接在实体中实例化这些助手有什么问题吗?我不认为我想在我的测试中模拟那些,但是OTOH我也无法在不测试这些策略对象的情况下测试CalculateFinancialGain方法。publicclassTicket{publicTicket(intid,ConstantRatesconstantRates){Id=id;ConstantRates=constantRates;}privateConstantRatesConstantRates{get;放;}publicintId{得到;私有集;}publicdoubleProjectedCosts{get;放;}publicdoubleProjectedBenefits{get;放;}publicdoubleCalculateFinancialGain(){varrateCalculator=newRateCalculator();变种金融计算器=新的金融计算器();vardiscountRate=rateCalculator.CalculateDiscountRate(ConstantRates.Rate1,ConstantRates.Rate2,ConstantRates.Rate3);返回financeCalculator.CalculateNetPresentValue(discountRate,ProjectedCosts*-1,ProjectedBenefits);}}publicclassConstantRates{publicdoubleRate1{get;放;}publicdoubleRate2{get;放;}publicdoubleRate3{get;放;}}publicclassRateCalculator{publicdoubleCalculateDiscountRate(doublerate1,doublerate2,doublerate3){//做一些jibbajabbareturn8.0;}}公共类FinanceCalculator{publicdoubleCalculateNetPresentValue(doublerate,paramsdouble[]values){returnMicrosoft.VisualBasic.Financial.NPV(rate,refvalues);让您的服务接受Ticket实体作为参数服务应该是无状态的,同一个服务应该能够为任意数量的实体提供服务。在您的情况下,我将从您的实体中提取FinancialCalculatorService和RateCalculatorService,并使每个服务的方法接受Ticket实体作为参数。花时间阅读pg。EricEvans的领域驱动设计105考虑到我们在课程中看到的内容,我不认为它们是真正的蓝皮书服务,我将把计算器放在Ticket上。FinancialCalculatorService和RateCalculationService都不依赖于域实体——它们都对原始值进行操作。应用程序不必担心如何计算机票可能带来的经济利益,因此将此信息封装在机票本身中很有价值。如果它们真的不依赖于域实体,请考虑将它们视为“独立类”??而不是“服务”(同样,在蓝皮书术语中)。Ticket依赖于策略对象(FinancialCalculator和RateCalculator)当然是合适的,它们本身没有外部依赖性并且它们本身不修改域实体的状态。编辑2的更新。我认为为计算器设置单独的类的一个优点是您可以独立于Ticket测试它们。严格来说,ticket不负责执行这些计算,它们负责正确调用这些co-op类。因此,我倾向于像您在原始示例中所做的那样注入/模拟它们。我会说服务消耗实体,而不是相反。另一件事,不确定你的域,但你确定票是一个实体而不是一个值对象?你实际上提出了一个已经讨论了很多的问题。曲目两边都有信徒,所以你需要自己决定什么最有意义。就个人而言,我没有让我的实体使用服务,因为它围绕“我如何干净地为我的实体提供服务?”创造了很多工作。问题。在我看来,CalculateFinancialGains()更像是一种服务级别调用。这确实会导致Ticket非常贫血,但我认为它还有其他行为?如果不是,那可能是一种气味……这个问题实际上是“CleanCode”(第96-97页)一书中讨论的一个示例。根本问题是是使用过程方法还是面向对象的方法。希望我没有违反这里重复的几个部分,但这里是BobMartin所说的指导:过程代码(使用数据结构的代码)使得在不更改现有数据结构的情况下添加新功能变得容易。另一方面,OO代码使得在不改变现有功能的情况下添加新类变得容易。赞美也是如此:程序代码很难添加新的数据结构,因为所有功能都必须更改。OO代码使得添加新功能变得困难,因为所有类都必须更改。我知道DDD“值类型”就是BobMartin所说的数据结构。希望对大家有所帮助,而不是徒劳无功:)以上就是C#教程:DDD实体利用服务分享的全部内容,如果对你有用,需要进一步了解C#教程,希望大家多多关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
