从业务对象类自动生成DataContract类

问题描述 投票:7回答:4

我目前正在创建一个.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类,同时还提供了映射属性代码前/后。

我当然可以,做手工所有这些工作(最坏情况),或推出自己的工具来生成/图(第二情形更糟糕)。但是,我想第一个知道,如果有已经做到这样的,我可以用我自己节省时间的东西的工具。

c# asp.net json datacontract
4个回答
2
投票

这是一个很好的问题。实际上,我将做一个项目,我的工作就类似于它的东西。

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

支出约在谷歌一个半小时后,我找不到用于此目的的代码生成器。也许我不是寻找正确的事情,也可能没有一个在那里(所以如果有人知道一个,请附和)。我发现,看起来很有希望的唯一工具是NHydrate(http://www.codeproject.com/Articles/42885/NHydrate-Code-Generator),但我没有实际下载或测试。

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


1
投票

我通过以前就做到了这一点:

  1. 使用XSD工具从您的编译DTO装配模式。
  2. 使用svcutil以从在步骤1中产生的的.xsd DataContracts。

编辑:

上述假定您Account类是一个DTO(因为你在你的例子给了唯一的迹象是,它包含两个属性,所以我认为它只是用来传送状态,而不是定义行为)。如果是这样的话,你只是想Account类的DataContract版本,那么上面的应该工作。您还必须提供代码到Account类映射到序列化Account类(由SvcUtil工具生成)。


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文件。例如下面的代码创建一个文件夹命名接口的所有实体的接口也类似名称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);        
        }
      }
    }
}

0
投票

下面是我确切地开发自己需要的工具。您可以派生,如果你需要更改设置。

https://github.com/lasuax/ClassToDataContract

© www.soinside.com 2019 - 2024. All rights reserved.