0

私は、Clean ArchitectureとDomain Driven DesignについてのPluralsightに関するいくつかのコースに従っていました。 DDDに関するEric Evanの本が届くのを待っているうちに、次のような状況と質問があります。DDDアーキテクチャを使用する場合、アプリケーション層でJsonProperty属性を使用できますか?

私は新しいプロジェクトを設定しています。

  • MyProject.Application
  • MyProject.Common
  • MyProject.Domain
  • MyProject.Infrastructure
  • MyProject.Persistance
  • MyProject.WebApi
:私は次のプロジェクトを追加しました

WebApiでモデルを返すことがビジネス上の要件です。

  • 私の命名規則に一致しません。
  • は醜いです。

このモデルは、MyProject.Applicationプロジェクト内に存在します。たとえば、次のように

namespace MyProject.Application 
{ 
    public class MyModel 
    { 
     public string _communityname { set; get; } 
     public List<string> photolist { set; get; } 
     public string postedby { set; get; } 
    } 
} 

通常、私は素敵な、それを維持するためにモデルのこれらの種類にJsonProperyのattibuteを適用する:

namespace MyProject.Application 
{ 
    public class MyModel 
    { 
     [JsonProperty("_communityname")] 
     public string CommunityName { set; get; } 

     [JsonProperty("photolist")] 
     public List<string> PhotoUrls { set; get; } 

     [JsonProperty("postedby")] 
     public string PostedBy { set; get; } 
    } 
} 

しかし、私はそれについて考えて...と私に言います:アプリケーション層は、 '物事'がどのように提示されるかについて心配すべきではありません。これは、プレゼンテーションレイヤのタスクです(この場合はWebApiです)。

これは間違いありませんか?アプリケーション層が通常のモデルを返し、WebApiにこれをビジネスに必要な任意の(醜い)プレゼンテーション形式にキャスト/変換させる必要があります。

事前に感謝します。

+1

これは適切な方法だとは言えませんが、私はWebApiのための単発モデルを用意しておきたいと思います。その方法で、私が望むすべての属性でカバーすることができます私のアプリケーションのモデルには影響しません。 – TyCobb

+0

はい。私もこのオプションを検討しています。それはちょうど1つで、おそらくこの調整を必要とする2つのエンドポイントです。私はFranのanwerを見ていて、計画が出てくる – JonHendrix

+1

@Tweek WebApi/MVCプロジェクトでは、内部ドメインロジックとUI/RESTのロジックが切り離されているので、常に別のビューモデルを使用します。私はそれがクリーナーだと思う。 http://stackoverflow.com/questions/4878937/why-should-i-use-view-models – Fran

答えて

0

私はMyProject.Applicationが実際に何をするかわからないんだけど?しかし、私はMyProject.WebApiを持っているので、あなたのRESTエンドポイントではないと推測しています。

それはユーザーに特定のデータフォーマットを示すとだけ関わっているので、私はWEBAPIプロジェクトに移動したいです。 WebApiプロジェクトにモデルまたはViewModelsフォルダを追加し、RESTエンドポイントを介して公開しているオブジェクトを保持します。そして、コントローラアクションまたはWebApiプロジェクトのサービスのいずれかで、ドメインモデルから「モデルを表示」に変換します。鍵の1つは、ドメインモデルを外部に公開していないことです。

また彼のオリジナルDDDの本が出版されて以来、彼が学んだかについてエリック・エヴァンスからこのビデオをチェックアウト。 https://www.infoq.com/presentations/ddd-eric-evans

この質問は、おそらくhttps://softwareengineering.stackexchange.com/よりもStackOverflowに適しています。

+0

迅速な対応と、ソフトウェアエンジニアリングへの私の指摘に感謝します。私は確かにEvanのビデオを見るつもりです。 – JonHendrix

+0

私は何年もの古典的な3層(データベース駆動型)のアプリケーション設計から来ています。私はこのDDD /クリーンなデザインに自分自身を強制しています。これまでのところ、アプリケーション層は、ユースケースを実行可能コードとして実装するレイヤーになります。これは、高度なアプリケーションロジックとして構成されます。それはドメイン層(依存関係)について知っていますが、プレゼンテーション、永続性またはインフラストラクチャ層についてはわかりません。これはMatthew Renzeの講座から取ったものです。 – JonHendrix

0

ウェブAPIがアプリケーションの唯一のエントリポイントである場合、私はそのプロジェクトにDTOを持たせることに傷つけるとは思っていません。通常、「アプリケーションサービス」を作成するときには、必ずしもapiによってのみ消費されるわけではありません。その場合、すべてのことを再考することになります。

あなたのREAD MODEL(DTO)は、あなたの「アプリケーションサービス」から返信したいデータの投影に過ぎません。クライアントは、Web API、またはそのサービスを使用する必要のあるその他のプロセスにすることができます。

意味がありますか?

+0

フィードバックいただきありがとうございます。私はこの新しいプロジェクトを始めるところです。実際、今のところ、APIはデータを提示する唯一の「エントリーポイント」または「フロントエンド」です。しかし、今後の選択肢が増えるのかどうかはわかりません。そうであれば、それはこの特定の有界コンテクストに収まるか、それともそれ自身の有界コンテクストを必要としますか? – JonHendrix

+0

あなたのDTO(またはProjected POCOs)はあなたのドメインの一部ではないことに注意してください。実際には、ドメイン操作から完全に切り離されます。これは、クライアント/コンシューマに魅力的な方法でデータを提供することなので、ドメイン操作から完全に切り離されます。 私はデータベースから直接読み込み、これをクライアント/コンシューマに投影するために、非常に軽量の "データリーダー"(実際にはADO.NETを使用できます)という別のプロジェクトを持っています。 SQLでは、実際にビューを作成し、直接またはSPROCをプルすることができます。あなた次第。クライアントが4つの異なるARから1つのDTOにデータを必要とする場合は、ビューに投影してクライアントに発送するだけです。 –

関連する問題