更新:重新发布 在程序员堆栈交换上,因为主要基于意见被搁置.
通常,域对象具有可以由内置类型表示的属性,但其有效值是可以由该类型表示的值的子集.
在这些情况下,可以使用内置类型存储该值,但必须确保始终在输入点验证值,否则我们可能最终使用无效值.
解决此问题的一种方法是将值存储为自定义struct
,该自定义具有private readonly
内置类型的单个支持字段,其构造函数验证提供的值.然后,我们始终可以确保仅使用此struct
类型使用经过验证的值.
我们还可以提供与底层内置类型相关的强制转换操作符,以便值可以作为基础类型无缝地进入和退出.
以我们需要表示域对象名称的情况为例,有效值是长度在1到255个字符之间的任何字符串.我们可以使用以下结构来表示:
public struct ValidatedName : IEquatable<ValidatedName>
{
private readonly string _value;
private ValidatedName(string name)
{
_value = name;
}
public static bool IsValid(string name)
{
return !String.IsNullOrEmpty(name) && name.Length <= 255;
}
public bool Equals(ValidatedName other)
{
return _value == other._value;
}
public override bool Equals(object obj)
{
if (obj is ValidatedName)
{
return Equals((ValidatedName)obj);
}
return false;
}
public static implicit operator string(ValidatedName x)
{ …
Run Code Online (Sandbox Code Playgroud)