質問

私の質問は、実際の実装と建築自然のより多くの、より少ない複雑です。

私は、WCFに基づいたAPIを構築していますが、本当にBLからPLを分離する方法を決定することはできません。それは、実装の最低限を保持しているように私は、私のサービスを薄くしている、のような何かます:

public TagItemResponse TagItem(TagItemRequest request)
{
   return (new ItemTagRequestProcessor()).GetResponse(request);
}

最初の質問が生じもちろんより、何層にRequestProcessorsが属しているのですか?私はファサードにそれらを呼び出すことが間違っていると思いますが、同時に、彼らはプレゼンテーションとは何の関係もありません。今のように、私は、彼らがそれにもかかわらず、PLに属していることを決定しました。

:プロセッサの方法はそうのように、(基本クラス)を認証し、最終的には単一DTO応答を返し、要求メッセージ(基底クラス)を検証し、入力としての私のDTOの(DataContracts)を取ります
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:

は、今、私は自分自身に尋ねる、なぜ私はFacadeクラス1が必要です。例えば、私はhostDAOとプロセッサとの間の層として作用HostFacadeを有します。それは、しかし、それは単にDAOコールを処理し、非常に少ないロジックを保持しています。

public static Host GetHost(HostDTO dto)
{
   return HostDAO.GetHostByCredentials(dto.Username, dto.Password);
}

質問:私も右、プロセッサやファサードをマージするかもしれません。

私は、件名に多くの記事/本を読んだが、私はまだ行くための「正しい」方法に落ち着くとは異なるアプローチ私は問題に直面するたびに選択することが多いことができません。右のアプローチも存在するのだろうか。

私が見つけたf.ex.彼らが正しいサービス実装内からDAOクラスに話を聞いたdoFactoryたとえば、。私はほとんどのServiceContract方法は、いくつかのロジックを共有するように、本当に好きではないので、共有の基底クラスで使用するためだけでなく自分自身を貸します。

私はまた、唯一のファサードは、サービス内から呼び出されている他の例を見つけたが、それは非常にきめ細かいメッセージのためにうまく動作するようです。私のメッセージは、できるだけ多くのサービスへの呼び出しの数を減らすために、「脂肪」と複合しています。私の余分な処理層は、私の本当の問題になるようです。

おそらく正しくWCFサービスの層にどのようにのように単一の答えはありませんが、うまくいけば、あなたのいくつかは、そこに私の本能に準拠したり、私のために件名にいくつかの新しい光を当てるするかの意見であります。

ありがとう!

ジェフリー

役に立ちましたか?

解決

まず、私はPLでプレゼンテーション層を意味することを前提とし、層を永続化しませんか?

階層アプリケーションの設計を実装する場合、主な問題は、常に次のようになります。私は上の層(複数可)の実装に影響を与えることなく、下層の実装を置き換えることができます。

これは通常、最高の永続化層によって示されています。あなたは、たとえばMySQLへのSQL Server 2008から切り替える場合は、永続層の変更(もちろん)。しかし、ビジネス層の変化も必要なのでしょうか。たとえば、唯一のSqlClientによってスローされているビジネス層キャッチのSQLExceptionインスタンスのでしょうか?良いデザインで、ビジネス層はまったく変更を必要としない。

同じ原理は、ビジネス層とプレゼンテーション層との分離に適用する必要があります。

あなたの例では、私はItemTagRequestProcessorは、プレゼンテーション層であってはならないと言うでしょう。まず、それはプレゼンテーションとは何の関係もない、第二、要求を処理の実装は、プレゼンテーション層のための問題ではありません。クライアントにTagItemResponseを提示するウェブ(プレゼンテーション)層の関心事である、Webアプリケーションとそれを比較してください。 <=>のインスタンスを取得することは、プレゼンテーション層の下の層の関心事である。

あなたのビジネス層と永続化層との間にファサードを持っているかどうかを決定することは困難です。それは間接の余分な(通常は不要)層を追加するので、私は通常、ファサードを実装していません。また、私は、ビジネス層のメソッドから直接永続化層のメソッドを呼び出すことで、問題が表示されません。場合にのみ、あなたのアカウントに同じ原理を取る:あなたはビジネス層の実装に影響を与えることなく、永続層の実装を変更することができます。

敬具、

ロナルドWildenberg

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top