实现领域驱动设计的函数式方法

2024-04-15

我在使用 C# 编写领域驱动应用程序方面拥有丰富的经验。我编写的应用程序越多,我就越发现我想要采用一种不太适合标准 C#/OO 技术的方法:

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

所以我一直在研究函数式语言,例如 F#。毕竟领域驱动设计没有理由has使用OO来实现。

我想知道是否有人对使用函数式语言进行领域驱动设计有任何想法/经验。尤其:

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

免责声明:我对领域驱动设计只有模糊的了解,所以答案可能没有使用正确的术语,并且可能过度关注代码而不是一般概念,但无论如何,这里有一些想法......

重点在于理解domain对于人们一般使用函数式编程语言的方式来说,而不是设计特定的功能或对象来实现它们似乎是很自然的。通常(至少在功能应用程序的一部分中),您首先要设计描述(或建模)您正在使用的世界的数据结构。数据结构与实现分离,因此它可以很好地建模领域。

一个非常好的例子描述于关于撰写金融合同的论文 http://research.microsoft.com/en-us/um/people/simonpj/papers/financial-contracts/contracts-icfp.htm。该示例是金融合同评估(和其他处理)的应用程序。最重要的是创建合同模型——它们实际上是什么?为了回答这个问题,作者设计了一个用于描述合约的数据结构。就像是:

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...
  // (...)

还有一些其他情况,但数据结构非常简单,并且对金融行业使用的各种相当复杂的合约进行了建模。

Summary我认为对用于对世界进行建模的数据结构(并与使用它们的实现分离)的关注与 DDD 的关键概念非常接近。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现领域驱动设计的函数式方法 的相关文章

  • 更换 I 过滤器

    我目前正在使用 IFilters 从各种文件 word excel tiff pdf 等 中提取文本 据我所知 IFilter 已在 Windows 8 中停止使用 是否有人对如何在不安装本机应用程序的情况下提取文本有任何建议 如果有什么用
  • 为什么当要求修剪“PRN.NUL”时,TrimStart 会更多地修剪字符?

    这是代码 namespace TrimTest class Program static void Main string args string ToTrim PRN NUL Console WriteLine ToTrim string
  • .NET“默认行终止符”?

    有什么方法可以弄清楚 NET 使用什么作为其 默认行终止符 例如 StringBuilder AppendLine String 的文档表示 附加指定字符串的副本 后跟默认行终止符 NET 中的几个与文本相关的类引用相同的概念 有什么方法可
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • VB.NET 中的静态方法实现

    我很困惑Static在 VB NET 中的实现 在 C 中 我们可以创建静态类和静态方法来为我们的应用程序编写实用方法 现在 VB NET 让我们创建Module代替静态类 如果我们在模块中创建一个方法 默认情况下它会变成静态的 但在我的应
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 如何向 F# 项目添加第三方 dll 引用?

    我正在向我的 F 项目添加第三方 dll 引用 我在引用中添加了 dll 当我使用它时 即突出显示代码并执行 Alt Ent 我收到错误 命名空间或模块 AZROLESLib 未定义 我是不是错过了什么 简而言之 你必须使用 r path
  • 取消任务

    我尝试运行一个关于取消任务的简单示例 如下所示 CancellationTokenSource tokenSource2 new CancellationTokenSource CancellationToken token2 tokenS
  • NuGet:包含 .pdb 文件并排除“Content”文件夹

    我已将以下行合并到 CI 构建中在每个构建上创建一个私有 NuGet 包 nuget pack C Projects Test Test vbproj OutputDirectory nas1 NuGet The 读取AssemblyInf
  • 如何在 F# 中实现返回 void 的接口成员

    想象一下 C 中的以下接口 interface IFoo void Bar 我如何在 F 中实现这一点 我在 30 分钟的在线搜索中找到的所有示例都仅显示具有返回类型的示例 我认为这在函数式风格中更常见 但在这种情况下我无法避免 这是我到目
  • 当操作系统显示语言为非英语时获取本地时区标识符

    奇怪的是 TimeZone CurrentTimeZone StandardName根据计算机显示语言返回本地化名称 我想要一个可以提供给的程序化标识符TimeZoneInfo在下面的代码中 TimeZoneInfo timeZoneInf
  • 比较已编译的 .NET 程序集?

    有没有什么好的程序可以与编译 NET 程序集进行比较 例如 我有 HelloWorld dll 1 0 0 0 和 HelloWorld dll 2 0 0 0 我想比较差异 我该怎么做 我知道我可以使用 NET Reflector 并使用
  • WPF:Prism 对于小型应用程序来说是不是太过分了?

    如果我不将我的应用程序分成不同的模块 否则我会认为 Prism 确实是可行的方法 我应该使用 Prism 吗 我知道 Prism 提供了一个方便的实现ICommand 我可以自己在一页代码中完成 并为我们提供IEventAggregator
  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 自定义代码访问安全属性

    我创建了以下属性 Serializable AttributeUsage AttributeTargets Class AttributeTargets Method AllowMultiple true Inherited true pu
  • 什么时候值得使用 BindingSource?

    我想我非常了解 BindingSource 类的作用 即在数据源和 UI 控件之间提供一个间接层 它实现了 IBindingList 接口 因此还提供了对排序的支持 而且我已经经常使用它 没有太多问题 但我想知道我使用它的频率是否超过了应有
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐