Gil*_*lla 8 c# generics design-patterns linq-to-xml
以下是该问题的业务部分:
现在,问题的技术部分是我想在C#中编写一个通用的解决方案来容纳这些信息进行处理.我将在我的C#类中转换XML以适应我的数据库模型.
是否有任何模式或解决方案可以一般性地处理这个问题,而不需要在以后添加许多公司时更改我的解决方案?
编写解析器/转换器的最佳方法是什么?
Jag*_*mag 11
这就是我过去做过类似事情的方式.
只要每个公司都有自己的固定格式,用于XML转储,
每个新公司的添加最多都是一个新的XSLT.在模式非常相似的情况下,可以重新使用XSLT,然后对它们进行特定的更改.
回顾这种方法:如果你没有合适的工具,调试XSLT可能会有点痛苦.然而,许多XML编辑器(例如XML Spy等)具有出色的XSLT调试功能.
在我看来,您只是在要求一种设计模式(或一组模式),您可以使用它以通用的、面向未来的方式来做到这一点,对吧?
理想情况下,您可能需要一些属性
理想情况下,每个“转换器”都应该实现您的驱动程序例程了解的通用接口 - 称之为 IXmlTransformer。该接口的职责是接收 XML 文件并返回用于保存到数据库的任何对象模型/数据集。每个变压器都会实现这个接口。对于所有转换器共享的通用逻辑,您可以创建一个所有继承自的基础类,或者(我的首选)拥有一组可以从其中任何一个调用的辅助方法。
我将首先使用工厂从主驱动程序例程创建每个“变压器”。工厂可以使用反射来询问它可以看到的所有程序集,或者像 MEF 这样的东西可以为你做很多工作。您的驱动程序逻辑应该使用工厂来创建所有变压器并存储它们。
然后,您需要一些逻辑和机制来“查找”给定 Transformer 接收到的每个 XML 文件 - 也许每个 XML 文件都有一个可用于识别的标头或类似的内容。同样,您希望将它们与主逻辑分离,以便您可以轻松添加新的变压器,而无需修改驱动程序例程。例如,您可以将 XML 文件提供给每个转换器并询问它“您可以转换该文件吗”,然后由每个转换器对给定文件“负责”。
每次您的驱动程序例程获取一个新的 XML 文件时,它都会查找适当的转换器并运行它;结果被发送到DB处理区。如果找不到转换器,则将文件转储到目录中以供稍后查询。
我建议阅读 Robert Martin 所著的《敏捷原则、模式和实践》(http://www.amazon.co.uk/Agile-Principles-Patterns-Practices-C/dp/0131857258) 等书,其中给出了适当的示例针对像您这样的情况的设计模式,例如工厂和 DIP 等。
希望有帮助!