jjzjj

c# - 领域驱动设计适合我的项目吗?

coder 2024-05-26 原文

我一直在阅读this ebook about DDD它说只有高度复杂的系统才适合 DDD 架构。这让我再次猜测我决定更多地转向 DDD 作为我的架构。

我正在将经典的 ASP 应用程序逐节转换为 .NET。它包括一个强大的产品分类方案和每天收到约 100-200 个订单的购物车,以及一个类似于 YouTube 的视频部分(视频和社交功能,如评分、评论等)。由于我已将其分块转换,因此我想将站点的每个区域视为单独的项目。

该站点不断获得新功能,并且需要易于维护和更新。

现在我只是使用一个基本的自制 ADO.NET DAL,其中 BLL 和 DTO 充当公共(public)层。

对于这个项目,使用与 DDD 不同的架构会更好吗?我是架构新手,想使用某种模式作为指导,我可以在整个转换过程中遵循它,以避免可怕的意大利面条式反模式。

如果不是DDD,那又是什么?仍在努力寻找一个好的方向。由于我仍在学习,因此无需成为完整的专家就可以快速轻松地开始。

最佳答案

DDD 不是一种架构。

这是一种设计哲学,您不能只是将所有 FooDAO 重命名为 FooRepositiories,放入反腐败层并将其称为 DDD。

它代表领域驱动设计。它侧重于您用来解决特定领域问题的模型。埃里克·埃文斯 (Eric Evans) 的建议是,如果您的网站只是加入邮件列表的一种形式,则没有理由在白板前花几天时间玩模型。我的观点是,如果您的域中只有一个上下文,则不需要 DDD。稍后会详细介绍。

有一句名言:

“There are only two hard problems in Computer Science: cache invalidation and naming things.” — Phil Karlton



DDD 确实有解决这些问题的模式。它提供了无处不在的语言作为模式来解决命名问题,并且它提供了经常被误解的模式集合:存储库、聚合、实体和值对象来解决模型一致性问题(我将缓存失效归为一类,这里不再赘述)。

但我会说最重要的是它增加了一个关键的第三项(不是 1 个问题):

Where to put stuff



在哪里放置代码和逻辑。对我来说, DDD 中最基本的概念是上下文 .并非所有问题都可以通过同一个模型得到最佳解决方案,了解一个上下文在哪里结束,另一个从哪里开始是 DDD 中关键的第一步。

例如,在我的公司,我们与 Jobs、Jobseekers 和 Recruiters 合作。求职者的世界与招聘人员的世界大不相同,他们对工作的看法也不同。例如,在招聘人员的世界(上下文)中,他们可以发布工作并说

I want to make this job available in New York, Austin, and San Fran.



用 OO 来说:一项工作有一个或多个位置。

在求职者的世界里,洛杉矶的工作与波士顿的工作不同。没关系,如果他们是同一家公司的同一职位。 物理位置的差异对求职者来说意义重大 .虽然招聘人员希望在一个地方管理所有 Widget Manager 工作,即使它们分布在全国各地,但纽约的求职者并不关心西雅图是否也有相同的职位。

那么问题是?一个工作应该有多少个位置?一个还是多个?

DDD 的答案是两者兼而有之。如果您在 的上下文中求职者那么一份工作只有一个地点,如果你是 招聘人员在这种情况下,一个工作可以有多个位置。

Jobseeker 上下文与 Recruiter 上下文完全分开,它们应该 不是 必然共享相同的模型。即使在一天结束时所有的作业最终都在同一个数据库中(可能是另一个上下文本身),在上下文之间共享模型可以使模型成为所有行业的杰作而一事无成。

现在这个例子非常特定于招聘和求职领域。它与 ADO 或 MVC 或 ASP 的 Entity Framework 无关。 DDD 与框架无关。

DDD 异端声称框架 A 或 B 使您的架构 DDD . DDD 的全部意义在于,模型应该满足特定领域内特定上下文的需求。框架只能支持并使其成为可能,它们不能:
$ dddonrails new MyDDDApplication
$ dddonrails generate context ContextA
$ dddonrails generate context ContextB
$ dddonrails generate model Widget ContextA
$ dddonrails generate model Widget ContextB
$ dddonrails start

专门解决这个问题,“DDD?还是不DDD?” 好消息是您不必一开始就决定 , “这将是一个 DDD 项目!”除了愿意认真思考您试图解决的问题并询问我的代码是帮助还是伤害我之外,DDD 不需要任何工具集?

坏消息是 DDD 需要认真的 promise 来审视和挑战你的设计,每天都要问“这个模型是否使这种情况下的问题尽可能简单?”

但是,将表示框架(MVC 或无 MVC)和持久性框架( Entity Framework ?)的一些战术和实际问题与业务域建模任务分开。如果您想立即开始,请考虑您的应用程序中的上下文。一些问题要问:
  • 应用程序的多个领域是否使用相同的基本数据解决不同的问题?
  • 有多少团队在开发应用程序?
  • 它们是如何相互融合的?

  • 将这些映射出来称为 绘制上下文 map 这是开始做 DDD 的重要第一步。

    我鼓励您结帐 the ddd website更多。 qcon 上也有一些很好的 eric evans 视频。您可能还想阅读 Eric Evans 的书域驱动设计,他有更多的例子。

    关于c# - 领域驱动设计适合我的项目吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5409324/

    有关c# - 领域驱动设计适合我的项目吗?的更多相关文章

    1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

      我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

    2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

      如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

    3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

      我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

    4. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

      我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

    5. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

      我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

    6. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

      我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

    7. c# - 如何在 ruby​​ 中调用 C# dll? - 2

      如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

    8. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

      我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

    9. Ruby 从大范围中获取第 n 个项目 - 2

      假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

    10. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

      rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

    随机推荐