Сериализация против инъекции ctor и защита инвариантов - PullRequest
2 голосов
/ 22 января 2012

Я мог бы упустить что-то очевидное здесь ...

Но, поскольку я учусь ценить славу IoC и инъекции ctor, у меня возникают проблемы с согласованием этого с сериализацией графов объектов.Совместимы ли эти две модели?Почему (или почему нет)?

Предположим, есть:

public class Foo
{
    #region invariants
    private readonly List<IBar> _bars;
    private readonly Guid _id;
    #endregion

    public Foo( List<IBar> bars, Guid id )
    {
        _bars = bars.CannotBeNull("bars");
        _id = id.CannotBeNull("id");
    }

    public List<IBar> Bars { get { return _bars; } }

    //some other state I want serialized
}

public static class Ex
{
    public static T CannotBeNull<T>( this T obj, string paramName = "" )
    {
        if ( null == obj ) throw new ArgumentNullException(paramName);
        return obj;
    }
}

Мне нравится железная оболочка для защиты инвариантов класса посредством инъекции ctor.Это дает моим объектам уверенность, что они всегда будут иметь то, что им нужно.Внедряется ли внедрение инвариантов в противоречие с шаблоном хранилища?Может быть, где-то есть слой DTO и фабричный шаблон, который устраняет разрыв ...?

Ищете мудрый совет ... Совместимы ли эти два шаблона?Почему (или почему нет)?

PS: я знаю о IDeserializationCallback, но не понимаю, как он помогает с инвариантами «только для чтения»

Ответы [ 2 ]

5 голосов
/ 22 января 2012

На эту тему есть статья Марка Симана, На границах приложения не объектно-ориентированы .Итог таков: на границах приложения не объектно-ориентированы.Если происходит какой-либо перевод (например, сериализация), ваши инварианты класса не могут быть защищены.

0 голосов
/ 22 января 2012

Мне не ясно, как ваш вопрос связан с шаблоном хранилища.Вам нужно сериализовать ваш репозиторий?

В любом случае, использование сериализации XML сопровождается ограничением необходимости иметь установщики в ваших свойствах.Как и вы, я предпочитаю сохранять неизменяемые классы для конструктора, поэтому я тоже нахожу это болезненным.Это просто реальность использования XML-сериализации в .Net, поэтому у вас нет выбора (я думаю, вы можете написать собственные сериализаторы, но это трудная задача IIRC).

Если у вас есть такая возможность, вы можетепосмотрите на переключение на двоичную сериализацию, которая может сериализовать закрытые переменные-члены.Лучший источник, который я могу найти, это здесь .

Редактировать: Я думаю, чтобы ответить на ваш вопрос более прямо: сами шаблоны не расходятся во мнениях, но реализация технологии (при использовании XML-сериализации) делаетони несовместимы.

...