我一直在努力使我的应用程序尽可能配置。
我正在使用Unity容器并尝试使用接口来处理所有内容。
在我的应用程序的某些时候,我需要将我的DTO序列化为XML,然后使用DataAccess层对该XML执行某些操作。
然而,我有一个想法。为什么它总是XML?这不应该也可以在容器中配置吗?序列化类型或类似的东西?
我知道可以使用XmlAttributes
但是将序列化与Xml紧密耦合。我在考虑使用ISerializable
,但我注意到IXmlSerializable
没有实现ISerializable
。
那么有谁知道如何使用接口/基类/抽象类来允许可配置的序列化,可以通过DI容器配置?
答案 0 :(得分:1)
从理论上讲,我认为输出格式不可知的属性是可能的,尽管它取决于(dis)的类似方式 输出格式是您要支持的。例如,XML和JSON都使用字段名称,但JSON没有 XML所具有的属性和元素之间的区别。另一方面,二进制序列化通常没有 用于字段名称,因为信息通常存储在位置。
说实话,我从来没有见过这样的实现。
我经常看到的是你定义了两个“模式”:
[XmlAttribute]
来存储数据库,这可能是使用[PrimaryKey]
属性,但也有一个逻辑实体的数据分布在多个实体上,因为数据库存储的数据更加规范化序列化与存储无关的实体然后首先将它们映射到特定于存储的类型,然后序列化这些类型。映射代码可以手写,也可以由AutoMapper完成。
这里的关键是,不是使用一组试图覆盖所有序列化需求的属性,而是创建一组专门设计为序列化为一种格式的全新实体,这通常更为可行。
顺便说一句,如果我可以给出一些未经请求的建议:我还没有看到需要序列化格式可插拔的应用程序。我的意思是,我理解分离关注点的必要性,并且“应用程序的其余部分不应该因为知道这个或那个而烦恼”,但在某些时候你必须做出<关于诸如数据将存储在哪个数据库中,或者您的应用程序将提供什么样的Web服务API的一些决定。
推迟做出这些决定或者过于努力地将它们抽象出来通常会损害代码的可理解程度以及向其添加新功能的容易程度。
一边是“关注点分离”,另一方面“可以将一个数据库引擎换成另一个”。确实,当您分离关注点时,通常更容易更改您正在使用的数据库类型,但(在我看来)能够交换数据库类型应该是一个结果,而不是它自己的目标。
重点回答你的问题:如果重新配置你的DI容器以改变它的序列化实体的方式需要花费更多的努力,我认为不好 - 改变这种情况几乎从未在现实中发生过。
只要您将序列化的知识限制在应用程序的特定部分,这样当您执行时,您就不必通过所有代码进行操作改变它:)