どのようなプロジェクトレイヤDTOのライブでの画面べきでしょうか?
-
20-08-2019 - |
質問
私たちはをサービス・レイヤーとプレゼンテーションレイヤーの間でデータをカプセル化するために、画面DTOのを使用するプロジェクトを持っています。私たちのケースでは、プレゼンテーション層は、ASP.Netである。
DTOのを知っている唯一のクラスは、サービス層のクラスと、これらのサービスを呼び出し、DTOの表示ページ/コントロールされます。
DTOのほとんど常にページ/コントロール固有のものですので、私は、彼らはプレゼンテーション層に属していると感じ、それはサービス層は、DTOのを使用するために、プレゼンテーション層を参照しなければならない意味します。
私はほとんど(?ではなくドメインエンティティ)サービス層は、より豊かなオブジェクトを返すべきであると考えているし、次にプレゼンテーション層は、これらのオブジェクトを取り、各ページのDTOのは、非常に特殊/懸念を制御するためにそれらをマップすることができます。
ここではインタフェース宣言だとDTOはそうあなたは私が話しているかを見ることができます:
public interface IBlogTasks
{
BlogPostDisplayDTO GetBlogEntryByTitleAndDate(int year, int month, string urlFriendlyTitle);
}
public class BlogPostDisplayDTO
{
public string Title { get; set; }
public DateTime PostDate { get; set; }
public string HtmlContent { get; set; }
public string ImageUrl { get; set; }
public string Author { get; set; }
public int CommentCount { get; set; }
public string Permalink { get; set; }
}
編集
ここでは、ドメインモデルが関与していないユースケースを記述するために別のコードサンプルです。多分これは、物事を少し明確になります。私は、DTOの意味をオーバーロードしましたと信じています。私は、ワイヤ上でオブジェクトを転送する機能のためにDTOの話ではありません。私は私のサービス層への通信間の契約を正式するのDTOを作成しています。
public interface IAuthenticationTasks
{
bool AuthenticateUser(AuthenticationFormDTO authDTO);
}
public class AuthenticationFormDTO
{
public string UserName { get; set; }
public string Password { get; set; }
public bool persistLogin { get; set; }
}
のは、私の認証突然のすべてがIPアドレスパラメータを必要としましょう。私は今、私の契約インターフェイスを変更することなく、DTOにそのプロパティを追加することができます。
私は私のプレゼンテーション層にエンティティを渡す必要はありません。私はBlogPost.AddComment(new Comment())
を移動する機能を持っているの背後にある自分のコードを望んでいない。
解決
がさえ「DTO」の標準的なユースケースは、あなたが本当に多くの「プレゼンテーション転送オブジェクト」または「ビュー・モデルを参照している、この場合には、より多くの「ワイヤ上を通過することができます直列化可能なオブジェクトを」であると思いました」ます。
「翻訳」のコードはそれがPTOクラスにDDDドメインモデルをマッピングしている。ここで、は、一般的に私たちのプロジェクトのためにこれらが住んでいる場所に答えがあります。それはPrensenation層(おそらくない素晴らしい答え)その後、PRESになら。私はのPTOを宣言したいところ層です。しかし少なからず、あなたのための翻訳を行い、それが両方の「サービス」と「表示」層は、(通常)のPTOへの参照して、それを必要とすることを意味し、その「サービス」は、別々にその宣言につながりますニュートラルプロジェクト/アセンブリ/名前空間/何でもそのプレゼンテーション層とサービス層の両方その後、参照することができます。
他のヒント
あなたは、実際のサービス(WebまたはWCF)を使用していますか?もしそうなら、サービス層内のDTOと(旧ASMXを使用している場合、またはWeb)あなたがサービスを追加するときに作成されたプロキシを定義参照はDTOタイプのすべてが含まれます。これはそれを行うための最も簡単な方法であり、あなたのASP.NETプロジェクトとサービス・プロジェクトの間だけの疎結合を維持 - は直接のプロジェクト参照はどちらの方向にも必要とされません。あなたのDTOを更新すると、あなたがする必要があるすべてはあなたのサービス参照を更新し、それが自動的に生成されたプロキシクラスを経由してWebプロジェクトへの更新を公開しますです。
あなたはDDDのアプローチのようなものを、次のしている場合は、いずれにしても、その逆よりも、あなたのドメインオブジェクトを参照する(例えばウェブ・プラットフォーム固有のUIなど)インフラストラクチャのプロジェクトを持っていることが最善です。あなたは上記の私のアドバイスに従うならば、しかし、あなたのWebプロジェクトは良いことです全くのプロジェクトに直接依存関係を、持っている、そしてそれがさえなかった場合(Webプロジェクトに応じて、あなたの豊富なドメインオブジェクトを持つよりも確かに良くはありません考察 - 私はあなたが)これをやっていたと言っていなかった実現
。あなたのDTOは、ビュー固有のものであれば、私はあなたのUIプロジェクトでそれらが含まれるであろう。本当に見るだけで、それは必要なものをモデルから取得することを保証するために、コントローラの仕事でなければなりません - 。あなたのケースでビューで必要なフィールドだけを持つ値オブジェクト