4

アプリケーションのドメイン モデルを表すさまざまな POCO エンティティのセットがあります。次に、他のアプリケーションによって消費されるさまざまなエンティティからのデータをコンパイルする xml 表現を考え出す必要があります。最終的な表現がどのように見えるかについては、参照 xml があります。

上記に基づいて、主にベスト プラクティスと最適化に関する 2 つの質問があります。

  • ターゲット xml 構造が与えられた場合、さまざまなエンティティからのデータに基づいて xml ファイルを作成するための最良かつ推奨される方法は何ですか? xsl 変換を使用するか、xsd に基づいてターゲット クラスを生成し、カスタム翻訳などを使用する必要がありますか?
  • これは POC 演習の一部であるため、XML 変換は最終的に、データベースでのデータの永続化または JSON オブジェクトへの変換に置き換えられます。xml 生成ルーチンが DAL 呼び出しまたは JSON 変換コードに置き換えられたときにプライマリ コードが影響を受けないように、何らかの設計パターンを使用してターゲット実装を抽象化できるかどうか疑問に思っていました。何か案は?
4

2 に答える 2

1

MS xsdツールを使用してターゲットxsdに基づいてターゲットモデル(POCO風)を作成し、変換の実装を非表示にするファサードを介してコードの変換を実行します。

変換を簡素化するために、たとえばgithubのAutomapperを使用できます。

ターゲットモデルから、たとえばEntity Frameworkを使用して、XML、JSONを生成したり、データを永続化したりするのは簡単です。

一般的なJSONシリアル化の例:

    public static string GetString<T>(T value)
    {
        using (var ms = new MemoryStream())
        {
            var ser = new DataContractJsonSerializer(typeof(T));
            ser.WriteObject(ms, value);
            byte[] json = ms.ToArray();
            ms.Close();
            return Encoding.UTF8.GetString(json, 0, json.Length);
        }
    }

私は過去にXSLTルートを試しましたが、それは強力ですが、複雑になる傾向があります。上記のターゲットモデルを使用すると、必要に応じてコンバージョンをデバッグできるようになります。また、今後のさまざまな機会も提供されます。

Re:AutoMapper、ターゲット構造が複雑でソースと異なる可能性があるこのような場合、AutoMapperですべてを直接マッピングするのは難しいので、通常、AutoMapperを内部で使用する全体的な構造/マッピングを担当するOrchestrator/SuperMapperを作成します。

ヒント:ターゲットに複数の値が必要な場合は、同じオブジェクトへの一連のマッピングとして設定することができます。この質問/回答を参照してください。

特定の構造を念頭に置いていない限り、良い一般的な答えを出すのは難しいです。

Re:ファサードウィキペディアにはこのパターンの適切な定義があります>>ウィキペディアのファサード しかし、要するに、オーケストレーター/ SupperMapperの可能な限り単純なインターフェースを定義して、構造を変換する内部動作をアプリケーションの他の部分から分離します。このようにして、ニーズが変わったときに他のものと簡単に交換できます。このように、アプリの残りの部分はAutoMapperまたはターゲットモデルについて知る必要はありません。それが知っているのは、ソースモデルを入れて、たとえばJsonを取り戻すことを期待することだけです。

于 2012-07-13T07:51:58.220 に答える
0

ここで探しているデザイン パターンは、データ転送オブジェクト (DTO)です。これらは動作のない単純なクラスです。次に、アセンブラーを作成して、アプリケーションのドメイン モデルから DTO に変換します。

DTOは、C# または VB.Net を使用していると仮定して、xsd.exeを使用して簡単に作成できます。他の言語に相当するものを見つけることができると確信しています。

このセットアップが完了すると、変換を行うためにアセンブラー内に置くものは、適切にカプセル化されているため、それほど重要ではありません。必要に応じて、将来簡単に変更できます。ただし、Tommy が言うように、XSLT を使用しないことをお勧めします。XSLT では実際に XML ドキュメントの形状を変更することしかできず、値の置換 (ID の列挙名) や計算 (注文明細の合計による合計) などを簡単に行うことはできません。

詳細については、次を参照してください。

http://martinfowler.com/eaaCatalog/dataTransferObject.html
http://msdn.microsoft.com/en-us/library/ms978717.aspx
http://en.wikipedia.org/wiki/Data_transfer_object

于 2012-07-13T08:49:30.557 に答える