【问题标题】:Dependency Inject Serialization Type依赖注入序列化类型
【发布时间】:2014-01-31 18:17:06
【问题描述】:

我一直在努力使我的应用程序尽可能可配置。

我正在使用 Unity 容器并尝试对所有内容使用接口。

在我的应用程序中的某个时刻,我需要将我的 DTO 序列化为 XML,然后使用 DataAccess 层对该 XML 进行处理。

但是,我有一个想法。为什么它总是 XML?那不应该也是可以在容器中配置的东西吗?序列化类型或类似的东西?

我知道有XmlAttributes 可以使用,但它将序列化与Xml 紧密耦合。我正在考虑使用ISerializable,但我注意到IXmlSerializable 没有实现ISerializable

那么有谁知道我如何使用接口/基类/抽象类来允许可通过 DI 容器配置的可配置序列化?

【问题讨论】:

  • 您是否正在寻找一种与输出格式无关的方式来装饰您的 DTO,以便它们描述序列化属性将具有的名称,而不管它们被序列化为什么? (即也适用于 JSON、二进制等的 XmlAttributes?)
  • @Astrotrain 是的,这就是我基本上想要做的。我希望能够从我的容器中从 XML 更改为 JSON 到二进制等。属性可以吗?

标签: c# .net serialization xml-serialization


【解决方案1】:

理论上我认为与输出格式无关的属性是可能的,尽管它取决于(不)相似的 输出格式是您想要支持的。例如,XML 和 JSON 都使用字段名称,但 JSON 没有 XML 具有的属性和元素之间的区别。另一方面,二进制序列化通常没有 用于字段名称,因为信息通常是按位置存储的。

但说实话,我从未见过这样的实现。

我经常看到的是你定义了两个“模式”:

  • 所有实体类都以与存储无关的方式定义,并且设计为易于在您的 业务逻辑(即使用计算的属性、继承以及任何其他可能对您有帮助的东西)。
  • 以及另一组专门设计用于序列化为一种特定输出格式的类。对于 XML,这可能意味着使用 [XmlAttribute]s,对于数据库中的存储,这可能是使用 [PrimaryKey] 属性,但也可以将一个逻辑实体的数据分布在多个实体中,因为数据库存储其数据更加规范化。

序列化与存储无关的实体然后归结为首先将它们映射到特定于存储的类型,然后序列化这些类型。映射代码可以手动编写,也可以通过 AutoMapper 之类的方式完成。

这里的关键是,与其使用一组试图满足所有序列化需求的属性,通常更可行的是创建一组专门设计用于序列化为一种格式的全新实体。


顺便说一句,如果我可以提供一些不请自来的建议:我还没有看到需要可插入序列化格式的应用程序。我的意思是,我理解关注点分离的必要性,并且“应用程序的其余部分不应该因为知道这个或那个而烦恼”,但在某些时候你必须一些决定,例如您的数据将存储在哪个数据库中,或者您的应用程序将提供哪种网络服务 API。
推迟这些决定或过于努力地将它们抽象出来通常会损害您的代码看起来的可理解性以及向其中添加新功能的难易程度。

在一侧的“关注点分离”和另一侧的“可以将一个数据库引擎换成另一个”之间有一条细线。确实,当您分离关注点时,通常更容易更改您正在使用的数据库类型,但是(在我看来)能够交换数据库类型应该是结果,而不是其本身的目标。

回到您的问题:我认为,如果它比重新配置您的 DI 容器来改变它序列化其实体的方式需要更多的努力,我认为这并不坏 - 无论如何,改变这种情况几乎从未发生过。
只要您将有关序列化的知识限制在应用程序的特定部分,这样当您确实拥有改变它:)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多