DI и JSON.NET - PullRequest
       30

DI и JSON.NET

11 голосов
/ 26 января 2010

Я использую JSON.NET для сериализации и десериализации объекта для различных целей. Я большой поклонник DI, но код ниже дает мне озноб. Пахнет как плохой код:

public class Foo : Baz
{
    private readonly IBar bar;

    public Foo()
        : this(ObjectFactory.GetInstance<IBar>())
    { }

    public Foo(IBar bar)
    {
       if (bar == null)
            throw new ArgumentNullException("bar");

       this.bar = bar;
    }

   ... rest of class ...
}

Конструктор по умолчанию - это то, что дает мне озноб. Я добавил это для поддержки десериализации, вызванной JSON.NET:

string jsonString = ...;
string concreteBazType = ...;

Baz baz = (Baz)JsonConvert.DeserializeObject(jsonString, Type.GetType(concreteBazType);

Обратите внимание, что класс Foo наследуется от абстрактного базового класса Baz!

Мой вопрос ко всем вам, фанатам DI и JSON.NET: как мне перейти на код, чтобы избежать запаха кода, который конструктор по умолчанию дает мне в классе Foo?

1 Ответ

20 голосов
/ 26 января 2010

Это общая проблема со всеми видами объектов передачи данных , подходят ли они для JSON.NET, WCF или других технологий. Фактически, можно сказать, что все классы , граничащие с приложениями , страдают от этой проблемы в той или иной степени. Эта проблема эквивалентна элементам управления Windows Forms и другим технологиям отображения.

На другом конце стека приложения мы видим ту же проблему с объектами конфигурации и, возможно, с некоторыми типами ORM (такими как классы Entity Framework).

Во всех случаях лучший подход состоит в том, чтобы рассматривать все такие Граничные объекты как тупые типы с большей структурой, чем поведение. Мы уже знаем, что это правильное решение для WCF DataContracts, ASP.NET MVC Views, Windows Forms Controls и т. Д., Так что это было бы хорошо известным решением проблемы.

Так же, как у нас есть контроллеры для заполнения представлений в пользовательском интерфейсе, у нас могут быть сервисные операции, средства отображения и все такое, что отображает DTO в доменные объекты. Другими словами, лучше всего не пытаться сериализовать Foo вообще.

Вместо этого определите класс FooJson, который представляет статическую структуру Foo, и используйте Mapper для преобразования между ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...