在花了几个月的时间研究DDD方法论之后,我现在开始将这些概念应用到我公司的实际产品中。事实上,我一直致力于为未来的发展创建合适的可维护体系结构。N层开发中的DDD概念
我们已经决定利用以下技术:EF4(真V2),统一
我获得一直是最有启发性的信息量,不过,我留下了最好的几个问题做法:
问题1:的DTO - 最佳实践
我有我的域对象(POCO类)。有几种方法来实现这些类。
- 传统方法:创建包含公共getter/setter方法,验证,&相应的业务逻辑POCO类。还要创建DTO并使用映射技术来管理它们。 (Automapper)
- 传统 - DTO:创建POCO类如上所述,但是,使用您的POCO作为传输对象。我的理解是,业务对象不应该离开域。
- 混合:我偶然发现了一个有趣的blog post,其中作者创建了他的POCO对象和DTO。在他的域对象内部,他创建了DTO的一个实例。这样可以更容易维护,因为您不像#1那样复制属性。像这样:
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;
问题2:哪些对象应该由UI /服务层被退回?
这是DTO的重点。一个非常简单,轻量级的对象,只包含裸露的属性。它也不包含任何验证结果。如果我将我的DTO序列化回客户端,则应该假定客户端需要任何验证结果,如InvalidRules集合。例如,假设我正在与亚马逊的API合作。我想添加一本书到我的个人商店。如果我尝试添加图书而未发送ISBN,该服务可能会返回某种包含验证结果错误的响应组。
我错过了什么吗?我的印象是(至少从DDD“纯粹主义者”),DTOs不应该包含商业逻辑。在我看来,DTO不能提供足够的信息作为传输对象。无论是那个还是我需要一个封装了DTO和验证结果的新类型的Response对象。
问题3:IoC有多少?
这似乎明显,我认为我应该遵循的金科玉律:
“找出变化的应用 的部分,并从这些 是保持不变分开。“
对我来说,这是有道理的申请的IoC方面。为了减少依赖,我的介绍,业务逻辑和数据访问层通过一个IoC容器中的所有通信。在我的应用层包含通用接口和抽象,似乎我喜欢这个事实,我可以创建模拟测试存储库 - 通过简单地改变Unity的配置,我可以利用TDD。
我希望我已经清楚地说明了这些问题。为您提前提供帮助!
未来,请将每个问题陈述为单独的StackOverflow问题... – 2009-11-25 08:57:31