Работа с объектами значения - PullRequest
1 голос
/ 25 ноября 2010

При разработке мне нравится иметь строго типизированные объекты для определенных значений. Примером может быть имя пользователя. Мне удалось создать эти объекты-значения с проверкой бизнес-правил в конструкторе (объекты являются неизменяемыми), но я при сериализации этих объектов веду себя в стиле фанк.

[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 ]

1 голос
/ 26 ноября 2010

Можете ли вы объяснить, что ' ведет себя странно '?

У меня нет опыта работы с Newtonsoft Json.Net, но обычно для сериализации / десериализации нужны:

  1. Public конструкторы по умолчанию на ваших объектах
  2. Свойство setters

Однако я думаю, что вы перепутали 2 разные проблемы здесь:

  1. С точки зрения DDD вам необходим неизменный объект значений (VO)
  2. .NET, позволяющий создавать классы, поддерживающие семантику VO
  3. JSON.NET +.NET do not позволяет сериализовать ваши VO

В предыдущем комментарии вы сказали:

... Если добавление типа преобразуется ввсе мои стоимостные объекты - это ответ, тогда я поставлю под сомнение ценность наличия значимых объектов в моем коде вообще ...

Это ошибочный вывод, потому что вы фактически говорите:

"Мне нужны ВО, потому что они помогают обеспечить целостность системы. Но потому что я не могу сделать технологиюПоддерживающие ВО, я собираюсь игнорировать эту концепцию DDD, т.е. Я собираюсь игнорировать целостность системы . "

Не совсем ответ для вас, но, надеюсь, это поможетвы идентифицируете реальную проблему.

1 голос
/ 25 ноября 2010

Никогда не пробовал, но я предполагаю, что он поддерживает преобразователи типов.

Добавьте атрибут 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, который преобразует ..."

...