11

我正在使用 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 类中给我的代码气味?

4

1 回答 1

20

这是各种数据传输对象的常见问题,无论它们是否适合 JSON.NET、WCF 或其他技术。实际上,您可以说所有面向应用程序的边界类都在某种程度上受到了这个问题的困扰。对于 Windows 窗体控件和其他显示技术,该问题是等效的。

在应用程序堆栈的另一端,我们看到配置对象和某些 ORM 类型(例如实体框架类)可能存在相同的问题。

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

就像我们有控制器来填充 UI 中的视图一样,我们可以有服务操作、映射器和其他将 DTO 映射到域对象的东西。换句话说,您最好的办法是根本不尝试序列化 Foo 。

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

于 2010-01-26T18:31:14.927 回答