从业务对象类自动生成数据协定类
本文关键字:数据 自动生成 对象 业务 | 更新日期: 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之间的关系,并且能够进行双向映射。
我以前通过以下方式做到这一点:
- 使用 XSD 工具从已编译的 DTO 程序集生成架构。
- 使用 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