我目前正在创建.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
类,还提供来回传递属性的代码。
当然,我可以手动完成所有这些工作(最糟糕的情况),或者使用我自己的工具来生成/映射(第二个更糟糕的情况)。但是,我想首先知道是否已经有一种工具来做这种事我可以用来节省时间。
答案 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)
我以前做过这个:
答案 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)
这是我完全根据您的需求开发的工具。如果需要,您可以分叉和更改设置。
答案 4 :(得分:0)
EggBlox完成了一项功能,即完全实现DataContract http://www.eggblox.com/ 它需要JetBrain Reshaper