2011-11-20 41 views
3

我是新来这个话题,我想知道你的意见,我应该做些什么或者我怎么能解决以下运行时映射:Automapper VS通过配置文件和反射

我开发一个C#Web服务客户端,从Web服务后面的数据库中检索数据。 Web服务响应将数据作为XML保存在CDATA元素中。 xsd模式可用。在XML中是代表一个数据集/行的元素。我只能使用一个数据集的几个字段。检索数据后,我必须检查一些业务规则/条件并将这些字段写入另一个系统。从另一个系统读取一些值,检查一些业务规则,并根据模式将它们发送回以适当的XML格式封装的Web服务。

我到目前为止做了什么。我使用XSD.exe根据底层架构生成c#类。我认为有以下几种选择让我的工作场景:

  1. ORM框架: 这应该是矫枉过正我的应用程序。或者它不是一个解决方案,因为我不直接与数据库通信。

  2. Automapper: 似乎是一个很好的解决方案。但我认为这不是像我的3.选项那样的灵活性(见以后)。如果在部署应用程序后检测到映射错误,我必须重新构建应用程序。另一个负面的问题是,如果模式发生变化,我将不得不重新构建我的应用程序。 (或者我总是根据模式来适应我的应用程序?)

  3. 通过自定义映射文件和反射: 我不确定这是否真的可以实现,但它是我认为最灵活的解决方案。解决方案将类似于此http://www.techrepublic.com/article/applied-reflection-dynamically-accessing-properties-of-a-class-at-runtime/6099345 如果我理解这篇文章是正确的,那么将会有一个配置文件,将类的类型及其属性映射到目标类型,例如: SourceClassType = ClassA,SourcePropertyName = PropA-> DestinationClassType = ClassB,DestinationPropertyName = PropX。

  4. Linq2Xml: 使用Linq2Xml我可以从XML中提取所需的数据并将其放入我自己定义的类中。但是,如何根据Web服务所期望的模式将数据放回到XML中呢?

我的分析是否正确?我误解了一些东西吗?你会推荐什么?我有其他选择吗?

回答

0

如果在部署应用程序后检测到映射错误,我必须重新构建应用程序 。另一个负面的问题是,如果 模式发生变化,我将不得不重新构建我的应用程序。 (还是我 总是根据架构适应我的应用程序?)

有不同的方式,以避免重建一个应用程序的所需代码变化的结果。一种方法是动态编译和使用组件。例如,这可以是源代码文件。这个决定涉及很多因素,例如需要多长时间一次更改,谁将进行更改,性能如何重要等等。

另一种选择是使用xslt将xml输入转换为xml输出,但它可能取决于您的业务规则中的具体要求。

我会做的是使用XML(DE)序列化和Automapper。将xml反序列化为对象,使用automapper和您的自定义业务逻辑将源代码转换为目标对象,然后将目标对象序列化为xml作为输出。