从Business Object Classes自动生成DataContract类

时间:2013-02-01 18:12:09

标签: c# asp.net json datacontract

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

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

有许多类,还有更多嵌套类(如ComplicatedClass类型属性所示)。为了避免使用[DataMember]等淹没此业务对象。将使此类变得混乱的属性,我想为DTO创建JSON

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

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

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

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

5 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

我以前做过这个:

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

  3. 修改

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

答案 2 :(得分: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);        
        }
      }
    }
}

答案 3 :(得分:0)

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

https://github.com/lasuax/ClassToDataContract

答案 4 :(得分:0)

EggBlox完成了一项功能,即完全实现DataContract http://www.eggblox.com/ 它需要JetBrain Reshaper