A lot http://gorodinski.com/blog/2013/02/17/domain-driven-design-with-fsharp-and-eventstore/f# 文章数推荐 http://fsharpforfunandprofit.com/posts/no-uml-diagrams/使用 fsharp 的内置类型(例如可区分联合、元组和记录)来对域进行建模。一旦我们有了这个模型,如何将其保存到数据库中?
实体框架和类型提供程序仅适用于具有可变属性的标准类。
你可以把[<CLIMutable>]
记录上的属性:
[<CLIMutable>]
type Foo = { Bar : string; Baz : int }
这会将其变成具有可变属性的类,通过 IL、C# 或 Visual Basic 查看时。从 F# 来看,它看起来仍然像是一个不可变的记录。
但这并不能真正解决问题,因为没有用于(反)序列化受歧视联合的相应功能。
(顺便说一句,IIRC、JSON.net 支持 F# 记录和可区分联合,但到目前为止,这是我知道的唯一例外。)
在我看来,这是一个因祸得福, 因为领域模型应该与持久性细节解耦.
在 C# 中,你可以think像实体框架这样的 ORM 提供了这种解耦,但事实并非如此。即使使用所谓的代码优先 POCO 实体,您最终仍然会创建一个关系型的模型,而不是面向对象的模型。想想“导航属性”,它们纯粹是关系问题。在 OOD 中,此类属性违反了得墨忒耳定律 https://en.wikipedia.org/wiki/Law_of_Demeter(我们称他们为火车残骸).
如果您想让域模型与实现细节分离,您需要首先创建模型,然后找到一种方法来持久化它。如何做到这一点取决于所使用的持久性技术。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)