【发布时间】:2015-08-08 10:44:35
【问题描述】:
lot 的 f# 文章 recommend 使用 fsharp 的内置类型(例如可区分联合、元组和记录)对域进行建模。一旦我们有了这个模型,如何将它持久化到数据库中?
实体框架和类型提供程序仅适用于具有可变属性的标准类。
【问题讨论】:
标签: entity-framework f# domain-driven-design
lot 的 f# 文章 recommend 使用 fsharp 的内置类型(例如可区分联合、元组和记录)对域进行建模。一旦我们有了这个模型,如何将它持久化到数据库中?
实体框架和类型提供程序仅适用于具有可变属性的标准类。
【问题讨论】:
标签: entity-framework f# domain-driven-design
您可以将[<CLIMutable>] 属性放在记录上:
[<CLIMutable>]
type Foo = { Bar : string; Baz : int }
这将把它变成一个具有可变属性的类,当通过 IL、C# 或 Visual Basic 查看时。从 F# 来看,它看起来仍然是不可变的记录。
但这并没有真正解决问题,因为没有(反)序列化可区分联合的相应功能。
(顺便说一句,IIRC,JSON.net 支持 F# 记录和有区别的联合,但到目前为止,这是我知道的唯一例外。)
在我看来,这是因祸得福,因为领域模型应该与持久性细节解耦。
在 C# 中,您可能认为像实体框架这样的 ORM 提供了这种解耦,但事实并非如此。即使使用所谓的代码优先 POCO 实体,您最终仍会创建 关系 模型,而不是面向对象的模型。想想“导航属性”,这纯粹是关系问题。在 OOD 中,此类属性违反了law of Demeter(我们称它们为 Train Wrecks)。
如果您想让域模型与实现细节分离,您需要先创建模型,然后再想办法将其持久化。如何做到这一点取决于所使用的持久性技术。
【讨论】: