gpt4 book ai didi

.net - DI 和 JSON.NET

转载 作者:行者123 更新时间:2023-12-04 01:45:49 25 4
gpt4 key购买 nike

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

最佳答案

这是各种Data Transfer Objects的通病。 ,无论它们是否适合 JSON.NET、WCF 或其他技术。事实上,你可以说所有面向应用程序边界 类或多或少会遇到这个问题。该问题与 Windows 窗体控件和其他显示技术相同。

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

在所有情况下,最好的方法是处理所有此类 边界对象 作为具有更多结构而不是行为的愚蠢类型。我们已经知道,对于 WCF DataContracts、ASP.NET MVC View 、Windows 窗体控件等来说,这是正确的做法,因此这将是一个众所周知的问题解决方案。

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

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

关于.net - DI 和 JSON.NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2140978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com