实现域驱动设计的功能方式

And*_*row 27 .net f# domain-driven-design

我在使用C#编写域驱动的应用程序方面有很多经验.我写的应用程序越多,我发现我想采用一种与标准C#/ OO技术不相符的方法:

  1. 我想编写尽可能多的纯函数,因为它们很容易测试.
  2. 我想以更具声明性的方式编写我的业务逻辑.

所以我一直在研究F#等函数式语言.毕竟没有理由为什么领域驱动设计使用OO实现.

我想知道是否有人在使用功能语言时对域驱动设计设计有任何想法/经验.特别:

  • 功能域模型会是什么样的?
  • 您将如何从域模型中抽象数据访问层.

Tom*_*cek 15

免责声明:我对域驱动设计只有一个模糊的知识,所以答案可能不会使用正确的术语,可能过于专注于代码而不是一般概念,但这里有一些想法...

对于理解领域而不是设计特定功能或对象来实现它们的关注似乎是人们如何使用函数式编程语言的一般方法.通常(至少在功能应用程序的一部分中),您首先要设计描述(或模型化)您正在使用的世界的数据结构.数据结构与实现分离,因此它很好地模拟了域.

关于撰写金融合约的论文中描述了一个非常好的例子.该示例是金融合同的估价(和其他处理)申请.最重要的是创建合同模型 - 它们实际上是什么?为了回答这个问题,作者设计了一个描述合同的数据结构.就像是:

type Contract = 
  | Zero                         // No trades
  | Single of string * float     // Single trade (buy something for some price)
  | And of Contract * Contract   // Combine two contracts 
  | Until of Contract * DateTime // Contract that can be executed only until...
  // (...)
Run Code Online (Sandbox Code Playgroud)

还有一些其他情况,但数据结构非常简单,并且模拟了金融行业中使用的各种非常复杂的合同.

总结我认为关注用于模拟世界的数据结构(并且与使用它们的实现分开)非常接近DDD的关键概念.


eul*_*rfx 6

这是惯用的F#实现的示例:具有F#和EventStore的域驱动设计

免责声明:我是作者。

  • 虽然这可能是一篇不错的文章,但很危险地接近仅链接的答案。 (3认同)

Szy*_*ega 5

使用Clojure(一种现代版本的Lisp)是一种新的想法,它是一种功能语言,用于创建域模型.这个演示文稿是一个非常好的介绍(它也是HTML5的一个很棒的演示).

长话短说,功能性态度与Event Sorcing相结合是很棒的.它可以让您轻松创建完全可测试的模型.如果你现在不想跳入全新的语言,现代C#是编写类似功能的代码的一种非常好的语言(至少对于实现常见的域模型)