7

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

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

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

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

    [DataMember(Name="someOtherProperty")]
    public string SomeOtherProperty { get; set; }
}

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

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

4

5 回答 5

2

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

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

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

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

于 2013-02-01T19:19:48.730 回答
1

我以前这样做过:

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


编辑:

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

于 2013-02-01T18:45:59.937 回答
1

方法是修改您的代码生成引擎(在我的情况下为 .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);        
        }
      }
    }
}
于 2019-02-06T20:15:26.027 回答
0

这是我为您的需求而开发的工具。如果需要,您可以分叉和更改设置。

https://github.com/lasuax/ClassToDataContract

于 2017-03-09T21:13:09.383 回答
0

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

于 2020-09-28T17:43:10.090 回答