从业务对象类自动生成数据协定类

本文关键字:数据 自动生成 对象 业务 | 更新日期: 2023-09-27 17:57:23

我目前正在创建一个.NET C# API。我有很多课程,其中一些必须通过REST服务作为JSON转移。例如,我可能有一个包含大量业务元数据的帐户对象:

public class Account
{
    public ComplicatedClass SomeProperty { get; set; }
    public string SomeOtherProperty { get; set; }
}

有许多类,还有更多的类是嵌套的(如 ComplicatedClass type 属性所示)。避免用[DataMember]等淹没此业务对象。会使这个类变得一团糟的属性,我想为JSON做一个DTO

public class AccountDTOForJSON
{
    [DataMember(Name="someProperty")]
    public ComplicatedClassDTOForJson SomeProperty { get; set; }
    [DataMember(Name="someOtherProperty")]
    public string SomeOtherProperty { get; set; }
}

我的问题是,似乎没有任何工具(我可以找到)自动生成这些DataContract类,并提供用于来回映射属性的代码。

当然,我可以手动完成所有这些工作(最坏的情况),或者使用自己的工具来生成/映射(第二种最坏的情况)。但是,我首先想知道是否已经有一个工具可以做这种事情,我可以用来节省时间。

从业务对象类自动生成数据协定类

这是一个很好的问题。我实际上将在我正在从事的项目中做类似的事情。

我认为这里确实存在两个问题:第一个是从业务对象生成 DTO 代码,第二个是进行业务对象和 DTO 之间的映射。

在谷歌上花了大约半个小时后,我找不到用于此目的的代码生成器。也许我没有在寻找正确的东西,或者可能没有一个(所以如果有人知道一个,请插话)。 我发现唯一看起来很有前途的工具是NHydrate(http://www.codeproject.com/Articles/42885/NHydrate-Code-Generator),但我实际上并没有下载或测试它。

我过去使用过的映射工具是AutoMapper(https://github.com/AutoMapper/AutoMapper/wiki/Getting-started) - 它将尝试找出业务对象和DTO之间的关系,并且能够进行双向映射。

我以前通过以下方式做到这一点:

  1. 使用 XSD 工具从已编译的 DTO 程序集生成架构。
  2. 使用 svcutil 从步骤 1 中生成的 .xsd 生成数据合同。


编辑:

上面假设您的Account类是 DTO(因为您在示例中给出的唯一指示是它包含两个属性,所以我假设它仅用于传输状态而不是定义行为)。 如果是这种情况,并且您只需要 Account 类的数据合同版本,那么上述方法应该可以工作。 您仍然必须提供代码以将Account类映射到可序列化的Account类(由 svcutil 生成)。

方法是修改代码生成引擎(在我的情况下为 .tt 文件或 T4 文件)并将 DataMember 属性添加到您想要的属性中。要将其添加到自动生成的 POCO 类中,请查找<#=codeStringGenerator.Property(edmProperty)#>并在其正上方添加[DataMember]

    var simpleProperties = typeMapper.GetSimpleProperties(entity);
    if (simpleProperties.Any())
    {
        foreach (var edmProperty in simpleProperties)
        {
#>
    [DataMember]
    <#=codeStringGenerator.Property(edmProperty)#>
<#
        }
    }

上面的代码的某些部分应该已经在 T4 文件中。 您可能需要找到它并通过向其添加[DataMember]来修改它。

此外,您还可以在任意位置创建具有所需属性的 DTO 文件。例如,下面的代码正在为名为 Interface 的文件夹中的所有实体创建一个接口,并将该接口命名为 I{EntityName}Repository.cs。您可以以相同的方式生成 DTO。

foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
{
    var host = this.Host.ResolvePath("App.config");
    var savepath = host.Replace("App.config","")+"Interface''" + "I"+entity.Name+"Repository" +".cs";
    var readpath = host.Replace("App.config","") + "Templates''";
    if (!File.Exists(savepath))
    {
        using (StreamReader sr = new StreamReader(readpath+"RepositoryInterfaceTemplate.txt"))
     {
                String line = sr.ReadToEnd();
               line = line.Replace("{RepositoryInterface}","I"+entity.Name+"Repository");
                line =line.Replace("{EntityName}",entity.Name);

        using (StreamWriter sw = File.CreateText(savepath))
        {       
            sw.WriteLine(@line);        
        }
      }
    }
}

这是我专门为您的需求开发的工具。如果需要,您可以复刻和更改设置。

https://github.com/lasuax/ClassToDataContract

EggBlox已经做了一个插件,它的功能之一就是实现DataContracthttp://www.eggblox.com/它需要JetBrain Reshaper