DI和JSON.NET

时间:2010-01-26 16:52:27

标签: .net json dependency-injection json.net

我正在使用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 个答案:

答案 0 :(得分:19)

这是各种Data Transfer Objects的常见问题,无论它们是否适合JSON.NET,WCF或其他技术。事实上,你可以说所有面向应用程序边界的类都会在一定程度上遇到这个问题。对于Windows窗体控件和其他显示技术,问题是等效的。

在应用程序堆栈的另一端,我们看到了与Configuration对象相同的问题,可能还有一些ORM类型(例如Entity Framework类)。

在所有情况下,最好的方法是将所有此类边界对象视为具有更多结构而非行为的哑类型。我们已经知道这对于WCF DataContracts,ASP.NET MVC视图,Windows窗体控件等是正确的做法,因此它将是一个众所周知的解决方案。

就像我们让控制器在UI中填充视图一样,我们可以使用服务操作,映射器以及将DTO映射到域对象的东西。换句话说,你最好的办法就是不要试图将Foo序列化。

相反,定义一个代表Foo静态结构的FooJson类,并使用Mapper在两者之间进行转换。