将数据库记录建模为类型

Dan*_*iel 6 f#

我在F#中重写一个C#库,其中大多数类与数据库表一对一映射(类似于ActiveRecord).我正在考虑是否使用记录或类(甚至可能是DU?).在属性设置器中有相当多的验证来维护不变量. 在F#中对此进行建模的最佳方法是什么? 我不希望将违反业务逻辑的对象持久化到数据库.欢迎任何想法.

还有一些想法......将不变量移动到外部"控制器"类是否更好?来自C#,允许与数据库记录对应的对象包含无法保存到数据库的任何内容,这是错误的.我想因为早先失败似乎比以后失败更好.

Cha*_*ion 2

这实际上应该是您处理它的好方法。在构造函数中包含验证逻辑将使您稍后在代码中放心,因为该对象是不可变的。这也开启了多线程的可能性。

不可变版本

type Customer (id, name) =

    do // Constructor
        if id <= 0 then 
            raise(new ArgumentException("Invalid ID.", "id"))
        elif String.IsNullOrEmpty(name) then 
            raise(new ArgumentException("Invalid Name.", "name"))    

    member this.ID
        with get() = id
    member this.Name
        with get() = name

    member this.ModifyName value =
        new Customer(id, value)    
Run Code Online (Sandbox Code Playgroud)

可变版本

type Customer (id) =

    let mutable name = ""

    do // Constructor
        if id <= 0 then 
            raise(new ArgumentException("Invalid ID.", "id"))

    member this.ID
        with get() = id
    member this.Name
        with get() = name  
        and set value =
            if String.IsNullOrEmpty(name) then 
                raise(new ArgumentException("Invalid Name.", "value")) 
            name <- value
Run Code Online (Sandbox Code Playgroud)