我正在尝试在F#中构建一个类型,当我得到该类型的对象时,可以确保它处于有效状态。
该类型称为JobId
,它仅包含一个Guid
。
业务规则是:它必须是Guid,但不能为空Guid。
我已经在C#中实现了该类型,但是现在我想将其移植到F#类库中。
这是C#类型:
public sealed class JobId
{
public string Value { get; }
private JobId(string value)
=> Value = value;
public static JobId Create()
=> new JobId(Guid.NewGuid().ToString("N"));
public static Option<JobId> Create(Guid id)
=> id == Guid.Empty
? None
: Some(new JobId(id.ToString("N"));
public static Option<JobId> Create(string id)
{
try
{
var guid = new Guid(id);
return Create(guid);
}
catch (FormatException)
{
return None;
}
}
}
那么我该如何在F#中构建它?谢谢!
更新1:
我试图将其实现为可区分的联合类型,如下所示:
type JobId =
| JobId of string
但是问题是,我无法用这种方法定义任何业务规则。
因此,最后一个问题是:如何确保string
中的JobId
特定格式?