0

他のいくつかのアプリケーションで使用しているビジネスオブジェクトレイヤーがあり、MVCアプリケーションで使用したいと考えています。私の懸念は、より設計上の懸念です。次のようなものがあるのは正しいですか。

using Interface.MyOtherProject
public class MyMVCController: Controller
{
    [HttpGet]
    public string GetSomethingById(Int32 id)
    {
        return new JavaScriptSerializer().Serialize(MyObject.GetById(id));
    }

}

したがって、問題は、これを実行できるかどうか、代わりにモデルでこれを実行してこの文字列をモデルから直接返すか、BLLをモデルに書き換えるかということです。私は同様の質問でいくつかの答えを読みましたが、私ができるかできないか(むしろすべきかどうか)はまだはっきりしていません。このプロジェクトを学校の仲間に見せるので、パターンを壊したくありません。

助けてくれてありがとう!

ハンレット

4

2 に答える 2

2

この決定に立ち向かわなければならないとき、私たちはビジネスオブジェクトをカプセル化/ミラーリングするビューモデルを作成しました。これにより、ビジネスレイヤーにビューロジックを追加しなくても、jsonでシリアル化したときにオブジェクトがどのように表示されるかをより細かく制御できます。

例:Personビジネス・オブジェクトがあるとします。

public class Person
{
  public int Id {get;set;}
  public string Name {get;set;}
}

クライアントがWebサービスを利用する場合、Idそれは内部データベースキーであるため、値が何であるかをクライアントに知られたくないでしょう。修正のために検討した2つのオプションは、1)プロパティに[ScriptIgnore]属性を追加するPerson.Idか、ビュードメインに合わせてカスタマイズされたPerson用の個別のビューモデルを作成することです。

ビジネスレイヤーにビューロジックを追加したくなかったのと同じ理由で、オプション1を使用しませんでした。ビジネスレイヤーは、プレゼンテーションレイヤーに直接関連付けられていません。

これは非常に単純化されたシナリオですが、より大きなアイデアはそのままです。個別のビューモデルを使用すると、ビジネスレイヤーのクリーンさを損なうことなく、ビューにデータを含めたり除外したりすることができます。

于 2011-09-14T15:24:29.970 に答える
1

ここでは、明白な設計上の懸念は見られません。質問の1つの特定のポイントに対処するには:

代わりにモデルでこれを行い、この文字列をモデルから直接返す必要があります

モデルがJSONでシリアル化された文字列を提供する必要があるということですか?いいえと思います。モデルはビジネスコンセプトの単なる表現であり、そのコンセプトに基づいて機能するロジックが含まれています。JavaScriptSerializer基本的に、そのモデルのビューを作成しています。これはUIロジックであり、プレゼンテーションコード内の適切な場所に属します。モデルは、それがどのように表示されているかを気にする必要はありません。モデルが表すものの状態を気にするだけです。

BLLをモデルに書き直す必要があります

ここで何を求めているのかわかりません。モデルにはビジネスロジックが含まれている必要があります。それは確かです。BLLが、モデルをベアDTOとして使用する一連のユーティリティメソッドである場合は、そのビジネスロジックをモデル自体に移動することを検討することをお勧めします。しかし、ここに示されているコードで見分けるのは難しいです。

DALリポジトリ(メソッドへのパラメータ以外の手段で提供されている可能性がありますが、内部的にインスタンス化されていないことを願っています)など、必要な依存関係を呼び出すモデルの静的ファクトリメソッドであるMyObject.GetById(id)ことがわかります。のインスタンス、これは問題ないようです。私は同じパターンを頻繁に使用し、メソッドに名前を付けて全体をより流動的にする方法を実験することもあります。GetByIdMyObjectMyObject

于 2011-09-14T14:19:47.683 に答える