私の質問は、実際の実装にはあまり関与せず、よりアーキテクチャ上の性質のものです。
私は WCF に基づいて API を構築しましたが、PL を BL から分離する方法を実際に決定することはできません。次のような最小限の実装のみを保持するように、サービスを薄くしました。
public TagItemResponse TagItem(TagItemRequest request)
{
return (new ItemTagRequestProcessor()).GetResponse(request);
}
もちろん、最初の疑問は、RequestProcessors がどの層に属しているかということです。それらをファサードと呼ぶのは間違っていると思いますが、同時にプレゼンテーションとは何の関係もありません。今のところ、それでも PL に属していると判断しました。プロセッサ メソッドは、私の DTO (DataContracts) を入力として受け取り、要求メッセージを検証し (基本クラス)、認証し (基本クラス)、最終的に次のように単一の DTO 応答を返します。
protected override void Process(TagItemRequest request, TagItemResponse response, Host host)
{
var profile = ProfileFacade.GetProfile(host, request.Profile);
var item = ItemFacade.GetItemId(host, request.Item);
var tags = new List<Tag>();
foreach (var name in request.Tags)
{
var tag = TagFacade.GetTag(profile, name);
ItemFacade.TagItem(item, tag);
tags.Add(tag);
}
ItemFacade.UntagItem(item, tags);
}
ここで、自分のビジネス オブジェクトに 1 対 1 で関連付けられたファサード クラスが必要な理由を自問します。たとえば、hostDAO とプロセッサの間のレイヤーとして機能する HostFacade があります。ただし、保持するロジックはほとんどなく、DAO 呼び出しを処理するだけです。
public static Host GetHost(HostDTO dto)
{
return HostDAO.GetHostByCredentials(dto.Username, dto.Password);
}
質問: プロセッサとファサードをマージすることもできますよね?
この件に関する多くの記事や本を読んだことがありますが、それでも「正しい」方法に落ち着くことができず、問題に直面するたびに別のアプローチを選択する傾向があります。正しいアプローチが存在するのだろうか。
f.exを見つけました。doFactory の例では、サービス実装内から直接 DAO クラスと通信しました。ほとんどの ServiceContract メソッドはいくつかのロジックを共有しているため、共有基本クラスでの使用に適しているため、私はそれがあまり好きではありません。
サービス内からファサードのみが呼び出される他の例も見つけましたが、これは非常にきめ細かいメッセージに対してのみうまく機能するようです。サービスへの呼び出し回数をできるだけ減らすために、私のメッセージは「ファット」で複合的です。私の余分な処理レイヤーが私の本当の問題のようです。
おそらく、WCF サービスを正しく階層化する方法について 1 つの答えはありませんが、私の本能に合致するか、この問題に新しい光を当ててくれる意見を持っている人がいるといいのですが。
ありがとう!
ジェフリー