7

現在、.NET C#APIを作成しています。私は多くのクラスを持っています、そしてそれらのいくつかはとしてRESTサービスを通して転送されなければなりませんJSON。たとえば、多くのビジネスメタデータを含むアカウントオブジェクトがあるとします。

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

多くのクラスがあり、ネストされているクラスもたくさんあります(ComplicatedClasstypeプロパティで示されているように)。このビジネスオブジェクトに[DataMember]etc.属性が殺到するのを避けるために、このクラスを混乱させる属性を作成したいと思いDTOますJSON

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

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

DataContract私の問題は、これらのクラスを自動生成し、プロパティを前後にマッピングするためのコードを提供するツール(私が見つけることができる)がないように見えることです。

もちろん、このすべての作業を手動で行うことも(最悪の場合)、独自のツールを使用して生成/マップすることもできます(2番目に悪い場合)。しかし、私は自分自身の時間を節約するために使用できるこの種のことを行うためのツールがすでにあるかどうかを最初に知りたいと思います。

4

5 に答える 5

2

これは良い質問です。私が取り組んでいるプロジェクトでは、実際にそれに似たようなことをするつもりです。

ここには、実際には2つの問題があることをお勧めします。1つはビジネスオブジェクトからDTOコードを生成することであり、もう1つはビジネスオブジェクトとDTOの間のマッピングを行うことです。

Googleで約30分過ごした後、この目的のコードジェネレーターを見つけることができませんでした。おそらく私は正しいものを探していないか、あるいはそこにないかもしれません(誰かがそれを知っているなら、チャイムを鳴らしてください)。有望に見える唯一のツールは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であることを前提としています(例で示したのは、2つのプロパティが含まれていることだけであるため、動作を定義するのではなく、状態を転送するためにのみ使用されると想定しています)。その場合、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は、その機能の1つがDataContractを実装することであるというプラグインを実行しました http://www.eggblox.com/JetBrainReshaper が必要です

于 2020-09-28T17:43:10.090 に答える