画面 DTO を使用してService LayerとPresentation Layerの間のデータをカプセル化するプロジェクトがあります。この場合、プレゼンテーション層は 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())