C# VisualStudio-DDD模块和Onion
我正在开发一个遵循DDD和Onion架构概念的C#应用程序,但我无法实现如何分离代码:C# VisualStudio-DDD模块和Onion,c#,visual-studio,domain-driven-design,onion-architecture,C#,Visual Studio,Domain Driven Design,Onion Architecture,我正在开发一个遵循DDD和Onion架构概念的C#应用程序,但我无法实现如何分离代码: 我希望它由模块分隔-有界上下文-(即销售;供应商;客户) 我希望它由层(即核心;服务)分隔 我想到了要做以下事情:每个层一个项目,每个模块一个文件夹(具有唯一的名称空间)。例如: 项目核心 文件夹销售 文件夹供应商 文件夹客户端 项目服务 文件夹销售 文件夹供应商 文件夹客户端 然而,我认为我可以反过来做:每个模块一个项目,每个层一个文件夹 我不知道是否还有更多的方法 谢谢。在VS中,一种行之有效的方
- 文件夹销售
- 文件夹供应商
- 文件夹客户端
- 文件夹销售
- 文件夹供应商
- 文件夹客户端
谢谢。在VS中,一种行之有效的方法是:
- 为每个模块创建一个项目。这是一种自然的方法,因为项目之间有明确的依赖关系
- 使用解决方案文件夹将项目分组到图层中。您可以在图层前面加上一个数字,以便它在visual studio中按顺序显示。请注意,解决方案文件夹是虚拟的,即在文件系统中不可见,但这通常不是一个问题
- 1个项目用于您的域模型。(每个有界上下文)因为在DDD中,重要的是每个人都说相同的语言/模型,所以将其作为一个项目
- 使用解决方案文件夹分隔层(如上文所述)
- 从每层1个项目开始,根据需要重构。 假设您的方法具有某种灵活性,则无需提前规划整个项目结构。就像你可以重构类一样,重构项目。记住以下几点
更新查看项目的代码图。如果它讲述了一个有意义的故事,那么你就是好人。如果它不尝试找出需要更改的内容。是。确切地DDD的设计非常适合在其方法中进行迭代。你第一次把它打出公园的可能性很小。这不一定是因为您没有正确地建模,而是因为您将从那些提供规范的人那里学到一些东西,这些规范会迫使您进行更改;持久性——数据库实现(EF、nHibernate等);域-包含域对象。不知道持久性或应用程序。还托管定义接口的存储库;服务-不属于域的代码(如供应商API),但由应用层使用;根据项目的复杂性和范围,有更多的层次。有时,这些服务并不完全在一个项目下运行。有时我需要一些东西来公开远程处理(比如WebApi或WCF)。有时我将DTO存储在一个单独的层中。我通常有一个应用层,它不知道客户端如何使用它。webapi/mvc层将封装这些调用。如果解决方案中有一个表示层(一个网站),那么也会调用应用层方法。我想你是在问在其他层中使用域对象是否可以。这是一个宗教问题一些开发人员可以在应用程序层公开它们。根据我的经验,特别是当它们绑定到像EF这样的持久性解决方案时,我倾向于只在应用层之外公开DTO。通过这种方式,整个事务被封装,只有相关数据从调用中出来。因此,例如,核心/销售、核心/供应商、应用程序/销售、应用程序/供应商、基础设施/销售、基础设施/供应商?@Franco If
销售
和供应商
是不同的BC(基于您的问题,我假设这是一个良好的结构。如果它们是独立的应用程序(前端)到同一个BC,然后制作一个域模块。同样,在这种情况下,基础设施可能是一个模块。我编辑了这个问题,以澄清模块是BC,谢谢。我喜欢你的方法,但整个解决方案中不会有很多程序集?我不知道现在这是否是一个需要担心的实际问题。这是一个权衡,但是一些总成(比如10-20)一点也不疼。但是你自己决定权衡吧!总的来说,我喜欢这个答案作为一个一般性的指导:非常有用,我只是想提前知道。我喜欢你的品牌和汽车类比。我会记住代码分析。