答案 0 :(得分:11)
您可以将[<CLIMutable>]
属性放在记录上:
[<CLIMutable>]
type Foo = { Bar : string; Baz : int }
这将把它变成一个具有可变属性的类,通过IL或C#或Visual Basic 查看时。从F#看,它仍然看起来像一个不可变的记录。
但这并没有真正解决问题,因为(de)序列化歧视联盟没有相应的功能。
(作为旁注,IIRC,JSON.net支持F#记录和受歧视的工会,但到目前为止,这是我所知道的唯一例外。)
在我看来,这是一个伪装的祝福,因为一个领域模型应该与持久性细节分离。
在C#中,您可能认为像实体框架这样的ORM提供了这样的解耦,但它并没有。即使使用所谓的代码优先POCO实体,您仍然最终会创建一个关系模型,而不是面向对象的模型。想想导航属性&#39;这是纯粹的关系问题。在OOD中,此类属性违反了law of Demeter(我们称之为 Train Wrecks )。
如果您希望将域模型与实现细节分离,则需要先创建模型,然后找出一种方法可以在之后保留它。如何做到这一点取决于使用的持久性技术。