使用值对象

时间:2010-11-25 09:39:48

标签: c# serialization domain-driven-design json.net

开发时我喜欢为某些值设置强类型对象。一个例子可以是用户名。我已经设法通过构造函数中的业务规则验证来创建这些值对象(对象是不可变的),但是当我序列化这些对象时,它们表现得很时髦。

[DebuggerDisplay("{Value}")]
public class Username
{
    private readonly string value;

    public Username(string value)
    {
        if (string.IsNullOrEmpty(value))
            throw new ArgumentException("value", "Must have a value");

        if (value.Length > 50)
            throw new ArgumentOutOfRangeException("value", "Maximum length of a username is 50");

        this.value = value;
    }

    public string Value
    {
        get { return value; }
    }

    public static implicit operator string(Username username)
    {
        return username.Value;
    }

    public static explicit operator Username(string value)
    {
        return new Username(value);
    }
}

我的问题是:使用像Newtonsoft Json.Net这样的序列化程序如何将这个值序列化为{ Username:"foobar" }

2 个答案:

答案 0 :(得分:1)

从未尝试过,但我猜它支持类型转换器。

将TypeConverter属性添加到您的类并为其创建转换器(从字符串到用户名,反之亦然)

Newtonsoft.json.net似乎支持这个: http://www.symbolsource.org/Public/Metadata/Project/Json.NET/3.5-Release-6/Release/net-3.5/Newtonsoft.Json/Newtonsoft.Json/Utilities/ConvertUtils.cs

请参阅以。开头的代码部分 “//查看源类型或目标类型是否具有转换...的TypeConverter”

答案 1 :(得分:1)

你能解释'行为时髦'吗?

我没有使用Newtonsoft Json.Net的经验,但通常需要序列化/反序列化:

  1. 对象上的公共默认构造函数
  2. 财产 setters
  3. 但是,我认为你在这里混淆了两个不同的问题:

    1. 从DDD角度来看,您需要一个不可变的值对象(VO)
    2. .NET允许您创建支持VO语义的类
    3. JSON.NET + .NET 允许您序列化您的VO
    4. 在先前的评论中,您说:

        

      ...如果添加类型转换为我的所有   价值对象就是我的答案   质疑有价值的价值   我的代码中的对象......

      这是一个有缺陷的结论,因为你有效地说:

      “我需要VO,因为它们有助于确保系统完整性。但由于我无法使技术支持VO,我将忽略这个DDD概念,即我将忽略系统完整性“。

      对您来说不是一个真正的答案,但希望它能帮助您识别真正的问题。