Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net N层开发中的DDD概念_.net_Domain Driven Design_N Tier Architecture_N Layer - Fatal编程技术网

.net N层开发中的DDD概念

.net N层开发中的DDD概念,.net,domain-driven-design,n-tier-architecture,n-layer,.net,Domain Driven Design,N Tier Architecture,N Layer,在花了几个月的时间研究DDD方法之后,我现在开始将这些概念应用到我公司的实际产品中。事实上,我的任务是为未来的开发创建一个合适的、可维护的体系结构 我们决定使用以下技术:EF4(真正的v2)、Unity 我获得的大量信息非常有启发性,但是,在最佳实践中,我还有几个问题: 问题#1:DTO-最佳实践 我有我的域对象(POCO类)。有几种方法可以实现这些类 传统方法:创建包含公共getter/setter、验证和适当业务逻辑的POCO类。还可以创建DTO并使用映射技术来管理它们。(汽车制造商) 传统

在花了几个月的时间研究DDD方法之后,我现在开始将这些概念应用到我公司的实际产品中。事实上,我的任务是为未来的开发创建一个合适的、可维护的体系结构

我们决定使用以下技术:EF4(真正的v2)、Unity

我获得的大量信息非常有启发性,但是,在最佳实践中,我还有几个问题:

问题#1:DTO-最佳实践

我有我的域对象(POCO类)。有几种方法可以实现这些类

  • 传统方法:创建包含公共getter/setter、验证和适当业务逻辑的POCO类。还可以创建DTO并使用映射技术来管理它们。(汽车制造商)
  • 传统-DTO:创建如上所述的POCO类,但是,将您的POCO用作传输对象。我的理解是,业务对象永远不应该离开域
  • 混合:我偶然发现了一个有趣的故事,作者在其中创建了他的POCO对象和DTO。在他的域对象内部,他创建了DTO的一个实例。这使得可维护性更容易,因为您不会像#1中那样复制属性。像这样:
  • 公共抽象类POCOBase:ValidationBase,IPOCO,其中T:DTOBase,new() { 公共T数据{get;set;} 公共POCOBase() { 数据=新的T(); } 公共POCOBase(T dto) { 数据=dto; } } 公共类SomePOCO:POCOBase{} 公共类SomeDTO:DTOBase { 公共字符串名称{get;set;} 公共字符串说明{get;set;} 公共布尔IsEnabled{get;set;} } //例子 //POCOBase somePOCO=新somePOCO(); //somePOCO.Data.Name=“blabla”; //somePOCO.Validate(); //返回somePOCO.数据; 问题2:UI/服务层应该返回哪些对象

    这就是DTO的全部要点。一个非常简单、重量轻的对象,只包含裸属性。它也不包含任何验证结果。如果我将DTO序列化回客户端,则应假定客户端需要任何验证结果,如InvalidRules集合

    例如,假设我正在使用Amazon的API。我想在我的个人商店中添加一本书。如果我尝试添加一本书而不发送其ISBN,该服务可能会返回某种包含验证结果错误的响应组

    我错过什么了吗?我的印象(至少来自DDD“纯粹主义者”)是DTO不应该包含任何业务逻辑。在我看来,DTO没有提供足够的信息作为传输对象。或者我需要一个新类型的响应对象来封装DTO和验证结果

    问题#3:国际奥委会多少钱太多

    在我看来,我显然应该遵循黄金法则:

    “识别应用程序的各个部分 那是不同的,并且与那些不同 保持不变。”

    对我来说,这在申请国际奥委会方面是有意义的。为了减少依赖性,我的表示层、业务逻辑层和数据访问层都通过IoC容器进行通信。我的应用层包含公共接口和抽象。使用比这更多的IoC似乎有点过头了。我喜欢这样一个事实:我可以创建模拟测试存储库——通过简单地更改Unity的配置,我就可以使用TDD


    我希望我已经把这些问题说清楚了。提前谢谢你的帮助

    我会一次一个地回答你的问题

    答案1

    DTO与DDD是正交的,因为它们在应用程序体系结构的不同位置服务于不同的目的。这就是说,DTO在域模型中没有位置,因为它们没有行为,因此会导致错误

    坚持无知的POCO才是出路。杰里米·米勒有个好主意

    答案2

    位于域模型顶部的层通常需要返回它们自己的对象,这些对象是为所讨论的目的而定制的

    对于UI,MVVM模式尤其有效。介绍了用于WPF的MVVM,但该模式在ASP.NET MVC中也很有魅力

    对于web服务,这就是DTO模式应用的地方。WCF数据合约是DTO,如果您想知道的话:)

    这将需要在服务接口和域模型之间来回进行大量映射,但这是为灵活的设计付出的代价。在这方面,你可能会觉得很有帮助

    答案3

    IoC越多(实际上是:DI)越好,但是关于你的问题,有一点让我印象深刻:DI容器应该只连接对象图,然后让路。对象不应依赖于DI容器


    有关更多详细信息,请参阅。

    以后,请将每个问题单独列为一个问题……感谢您的评论。我的理解是,当域对象没有任何业务逻辑时,就会出现贫乏的域模型。他们仍然是一群能手。ADM的另一个要点是逻辑(如验证)发生在对象外部而不是包含在对象内部。如果你回顾问题1,混合方法。。。对我来说,在一个持久的无知域对象中创建一个DTO实例并不一定构成一个贫乏的域模型。你是对的,因为它违反了DDD原则。我可能还得再深入一点,答案2很完美。我倾向于可能需要创建自定义返回对象。谢谢你对MVVM的建议。。。我现在正在ASP.NET web.config中配置DI容器,然后使用Global.asax进行设置。对于您的答案3,如果我理解正确的话:所以要实现TDD方法,我只需在- public abstract class POCOBase<T> : ValidationBase, IPOCO where T : DTOBase, new() { public T Data { get; set; } public POCOBase() { Data = new T(); } public POCOBase(T dto) { Data = dto; } } public class SomePOCO : POCOBase { } public class SomeDTO : DTOBase { public String Name { get; set; } public String Description { get; set; } public Boolean IsEnabled { get; set; } } // EXAMPLES // POCOBase<SomeDTO> somePOCO = new SomePOCO(); // somePOCO.Data.Name = "blablabla"; // somePOCO.Validate(); // return somePOCO.Data;