4

私は、開発者がドメイン モデルからビューを抽象化するために使用しているさまざまな方法を発見することに興味があります。

現在、ビューで使用するモデルごとに ViewModel を作成しており、IConverter<TIn,TOut>そのためのコンバーターがあります。

私が気づいたのは、他の型のコレクションを含む型の場合、階層内の各型の ViewModel と、他のコンバーターを使用して最終的な ViewModel を構築するコンバーターがあることです。

例として:

FluentNHibernate で構築された次のドメイン モデル構造があるとします。

public class User
{
 [...]
   public virtual IEnumerable<QuestionSubscription> QuestionSubscriptions{get;set;}
}

public class QuestionSubscription
{
   public virtual bool VerifiedSubscription{get;set;} 
   public virtual Question Question{get;set;}
}

私がこれを行っている方法を考えると、これをサポートする 3 つの ViewModels があり、カスタム コンバーターを使用するため、User から Question への変換のチェーンがあります: (簡潔にするためにいくつかの名前を短縮しました)

_userToUserViewModelConverter.Convert(userModel)
              |
              V 
              _qSubscriptionToViewModelConverter.Convert(userModel.QSubscriptions)
                   |
                   V
                  _questionToViewModelConverter.Convert(QSubscription.Question)

これはうまく機能しています。これを管理する他の方法について疑問に思っています。

私の最初の質問は、私のドメイン モデルが私のビューに触れないようにすることで、正しいアプローチを取っていると思いますか?

次に、質問 1 に「はい」と仮定すると、コンバーターに他のコンバーターを実行させる同じアプローチを使用しますか、それともコントローラーで一度に 1 つずつ実行しますか?

4

4 に答える 4

4

automapper でネストされたマッピングを見てください: Nested mappings

これにより時間を大幅に節約できます。プロジェクトで ORM を使用している場合、マッピングはすぐに簡単になります :)

于 2012-06-19T18:47:47.327 に答える
0

私はしばしばドメイン オブジェクトを公開するビューを持っていますが、ほとんどのシナリオでそれが問題になるとは思いません。

ドメイン オブジェクトをフラット化すると、オブジェクト階層が削除されるか、少なくとも単純化されるため、多くの場合、ビューがより単純で理解しやすくなります。あなたの方法はオブジェクトを平らにする方法のように見えますか?

まだ慣れていない場合は、 AutoMapperを見てみましょう。これは、ドメイン オブジェクトをビューにフラット化するために通常使用するものです。

于 2012-06-19T18:24:19.120 に答える
0

私の最初の質問は、私のドメイン モデルが私のビューに触れないようにすることで、正しいアプローチを取っていると思いますか?

答えは: はい、これはソフトウェアに取り組む正しい方法です。MVVM、MVC、MVP、MVPVM などの多くのパラダイムが示すように、ビュー内のモデル オブジェクトを直接接続することから生じるいくつかの問題を解決しようとします。

次に、質問 1 に「はい」と仮定すると、コンバーターに他のコンバーターを実行させる同じアプローチを使用しますか、それともコントローラーで一度に 1 つずつ実行しますか?

通常、ViewModel は View と Model の間のアダプターです。

したがって、通常、モデル内のすべてのクラスの ViewModel ではなく、ビューに表示される抽象部分を表す ViewModel があります。

これは、たとえば、フォーミュラー全体、リスト、特にリスト内のアイテムであり、多くの場合、モデルの 1..n オブジェクトで構成されます。しかし、ViewModel の最も興味深い点は、ビューによって簡単にバインド (バインド?) できる形ですべてのデータを取得することです。このようにして、ビューには、必要なデータにアクセスするための簡単な方法があります。適切に設計されていれば、モデルが変更された場合に小さな更新を行うだけで済みます。

モデルとは何か、変更を認識できるアプリケーションを設計する方法、つまり保守可能でテスト可能なアプリケーションを設計する方法に関する非常に優れた情報源がいくつかあります。つまり、ソフトウェアが期待どおりに機能すると簡単に断言できます。

読むことをお勧めします: WPF アプリケーション フレームワーク (WAF) / レイヤード アーキテクチャの MVVM

于 2012-06-19T18:52:14.720 に答える
0

ValueInjecterも参照する必要があります(はい、そのように綴られています)。私は Automapper と ValueInjecter の両方を使用しましたが、ほとんどの場合、Automapper とは異なり設定が必要ないため、ValueInjecter を使用する方が簡単であることがわかりました。Automapper は、より複雑なオブジェクトやネストされたコレクションを持つオブジェクトに適しています。

于 2012-08-14T10:24:51.770 に答える