首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DI和JSON.NET

DI和JSON.NET
EN

Stack Overflow用户
提问于 2010-01-26 16:52:27
回答 1查看 3.1K关注 0票数 11

为了不同的目的,我使用JSON.NET来序列化和反序列化对象。我是DI的忠实粉丝,但下面的代码让我感到非常震惊。闻起来像是坏代码:

代码语言:javascript
运行
复制
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引起的反序列化:

代码语言:javascript
运行
复制
string jsonString = ...;
string concreteBazType = ...;

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

注意,Foo类继承自抽象基类Baz!

我向所有的DI和JSON.NET极客提出的问题是:我如何才能更改为代码,以避免默认构造函数在Foo类中给我的代码嗅觉?

EN

回答 1

Stack Overflow用户

发布于 2010-01-26 18:31:14

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

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

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

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

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

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2140978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档