如何设计一个可以查询数据库并返回实现相同接口的不同类型的方法?

时间:2017-09-19 18:06:22

标签: c# generics xsd dapper

上下文

我们正在为政府开发软件,政府发布一些描述XML文件结构的PDF及其各自的XSD。因此,我们生成了XSD所需的所有POCO类,一切都很顺利。

政府发布了同一XSD的太多版本,我们的软件需要处理所有不同的版本。所有版本都非常相似,但差别不大。添加了一些字段,其他字段被排除,一些字符串在一个版本中支持四个字符,在其他版本中仅支持三个字符,依此类推。

我的问题是如何设计我的软件以同时处理所有不同的版本。

目前,我正在从XSD生成POCO类,并在不同的名称空间中存储不同的版本,例如来自ver1ver2名称空间的相同S1000类的示例:

namespace GPLayoutsESocial.ver1.S1000
{
    public partial class S1000 : IEventoEsocial
    {
         //...
    }
}

namespace GPLayoutsESocial.ver2.S1000
{
    public partial class S1000 : IEventoEsocial
    {
         //...
    }
}

这种方式(并使用工厂方法),我可以轻松获得特定版本。

问题

我需要开发一个查询数据库的方法来完全填充我POCO的属性,但是我不想为每个版本创建一个方法(因为它们非常相似)而且我不知道我需要填充的版本。 事实上,我需要一个方法,通过参数接收版本,查询数据库并返回正确的POCO类版本,调用可能是这样的:

var result = Fullfil_S1000(int version); 

Fullfil_S1000方法中实施什么?我正在考虑下面的方法:

 public ??? ObterDadosEvento(int version, ...)
 {
    using (IDbConnection cn = ConexaoGPG.Connection)
    {
        cn.Open();
        item = cn.Query<ver1.S1000>(" SELECT * FROM... }).SingleOrDefault();
    }

    // If the version == 1:
    // - Executes the query and return the POCO from "version1"

    // If the version == 2:
    // - Runs the query to get the "version 1", 
    // - Pass the version1 POCO to another method that updates only the fields changed in the version2 and 
    // - returns the "version2" POCO.

    // If the version == 3:
    // - Runs the query to get the "version 1", 
    // - Pass the version1 POCO to another method that updates only the fields changed in the version3 and 
    // - returns the "version3" POCO.

    // And so on...

如何在不需要硬编码来处理每个版本的情况下实现上述步骤?

1 个答案:

答案 0 :(得分:0)

我不知道&#34;清洁&#34;维护一个处理多个XSD结构的C#/ XmlSerialization代码库的方法,但这是一个很常见的问题。

如果XSD真的很相似,那么一种不优雅但非常易于维护的方法可能是创建和维护自己的XSD,它代表了选项的结合。然后使用基于文本的预处理和后处理在您的格式和政府之间进行转换。例如,替换出XML名称空间。

预处理规则和后处理规则通常只是RegEx查找/替换字符串对的集合,按版本分组。或者(例如)它们可以是XSLT文件的形式。