C# VisualStudio-DDD模块和Onion

C# VisualStudio-DDD模块和Onion,c#,visual-studio,domain-driven-design,onion-architecture,C#,Visual Studio,Domain Driven Design,Onion Architecture,我正在开发一个遵循DDD和Onion架构概念的C#应用程序,但我无法实现如何分离代码: 我希望它由模块分隔-有界上下文-(即销售;供应商;客户) 我希望它由层(即核心;服务)分隔 我想到了要做以下事情:每个层一个项目,每个模块一个文件夹(具有唯一的名称空间)。例如: 项目核心 文件夹销售 文件夹供应商 文件夹客户端 项目服务 文件夹销售 文件夹供应商 文件夹客户端 然而,我认为我可以反过来做:每个模块一个项目,每个层一个文件夹 我不知道是否还有更多的方法 谢谢。在VS中,一种行之有效的方

我正在开发一个遵循DDD和Onion架构概念的C#应用程序,但我无法实现如何分离代码:

  • 我希望它由模块分隔-有界上下文-(即销售;供应商;客户)
  • 我希望它由层(即核心;服务)分隔
  • 我想到了要做以下事情:每个层一个项目,每个模块一个文件夹(具有唯一的名称空间)。例如:

    项目核心

    • 文件夹销售
    • 文件夹供应商
    • 文件夹客户端
    项目服务

    • 文件夹销售
    • 文件夹供应商
    • 文件夹客户端
    然而,我认为我可以反过来做:每个模块一个项目,每个层一个文件夹

    我不知道是否还有更多的方法


    谢谢。

    在VS中,一种行之有效的方法是:

    • 为每个模块创建一个项目。这是一种自然的方法,因为项目之间有明确的依赖关系
    • 使用解决方案文件夹将项目分组到图层中。您可以在图层前面加上一个数字,以便它在visual studio中按顺序显示。请注意,解决方案文件夹是虚拟的,即在文件系统中不可见,但这通常不是一个问题

    根据我做的上一个DDD项目,我得出以下结论:

    • 1个项目用于您的域模型。(每个有界上下文)因为在DDD中,重要的是每个人都说相同的语言/模型,所以将其作为一个项目

    • 使用解决方案文件夹分隔层(如上文所述)

    • 从每层1个项目开始,根据需要重构。 假设您的方法具有某种灵活性,则无需提前规划整个项目结构。就像你可以重构类一样,重构项目。记住以下几点

    1) 确实有一个项目有自己存在的理由。例如,一辆汽车有存在的理由,我可以买一辆,更换一辆等等。一个引擎部件本身没有存在的理由。除非我有匹配的车,否则我不会买它

    2) 避免代码分析中出现“此命名空间中的类太少”警告。如果我在每个品牌中只有几种类型的汽车(并且不涉及许多单独的汽车零件),那么就把整个品牌放在一个项目中

    3) 查看单个项目层次结构是否适合解决方案资源管理器中的一个屏幕(或2个屏幕)。 一旦你开始搜索一个项目,你就知道在一个项目中存在,然后考虑拆分项目。例如,汽车可以按品牌分开

    让解决方案的复杂性随着项目的增长而增长。虽然我见过100个项目的解决方案,但我很少看到它能工作。同样的情况也适用于超过100个类的项目(项目可能会多一点)

    如果你把它放在那些人中间,你可能会安全的


    更新查看项目的代码图。如果它讲述了一个有意义的故事,那么你就是好人。如果它不尝试找出需要更改的内容。

    是。确切地DDD的设计非常适合在其方法中进行迭代。你第一次把它打出公园的可能性很小。这不一定是因为您没有正确地建模,而是因为您将从那些提供规范的人那里学到一些东西,这些规范会迫使您进行更改;持久性——数据库实现(EF、nHibernate等);域-包含域对象。不知道持久性或应用程序。还托管定义接口的存储库;服务-不属于域的代码(如供应商API),但由应用层使用;根据项目的复杂性和范围,有更多的层次。有时,这些服务并不完全在一个项目下运行。有时我需要一些东西来公开远程处理(比如WebApi或WCF)。有时我将DTO存储在一个单独的层中。我通常有一个应用层,它不知道客户端如何使用它。webapi/mvc层将封装这些调用。如果解决方案中有一个表示层(一个网站),那么也会调用应用层方法。我想你是在问在其他层中使用域对象是否可以。这是一个宗教问题一些开发人员可以在应用程序层公开它们。根据我的经验,特别是当它们绑定到像EF这样的持久性解决方案时,我倾向于只在应用层之外公开DTO。通过这种方式,整个事务被封装,只有相关数据从调用中出来。因此,例如,核心/销售、核心/供应商、应用程序/销售、应用程序/供应商、基础设施/销售、基础设施/供应商?@Franco If
    销售
    供应商
    是不同的BC(基于您的问题,我假设这是一个良好的结构。如果它们是独立的应用程序(前端)到同一个BC,然后制作一个域模块。同样,在这种情况下,基础设施可能是一个模块。我编辑了这个问题,以澄清模块是BC,谢谢。我喜欢你的方法,但整个解决方案中不会有很多程序集?我不知道现在这是否是一个需要担心的实际问题。这是一个权衡,但是一些总成(比如10-20)一点也不疼。但是你自己决定权衡吧!总的来说,我喜欢这个答案作为一个一般性的指导:非常有用,我只是想提前知道。我喜欢你的品牌和汽车类比。我会记住代码分析。