2011-10-23 13 views

答えて

0

はいいスタートになりますどのようにあなたがプレゼンターをかけることになり、データアクセスも層、ビューなどを意味します。プロジェクトが大きくなった場合は、さらに分割できます:あなたは、複数のUIを持っていることを計画場合は、いくつかの追加の分離を持っているかもしれませんが

Company.Project.Core -> Controller logic 
Company.Project.Domain -> Domain models (view models and database models) 
Company.Project.Interface -> Views, presenters 
+1

通常、コアはドメインクラス用に予約されていますが、実際には両方のプロジェクトが存在すると仮定して、データモデルと同じアセンブリ/名前空間内にあるべきではありません。 'UI'は、' Interface'よりもユーザーインターフェースコードのためのより一般的な規約です。 – Aaronaught

1

ソリューションのアーキテクチャは、一般的に使用しているどのUIアーキテクチャのかなり独立していますアプリケーション(ほとんどのプロジェクトはそうではありません)。

私はこれに似たテンプレートから始める傾向がある:

  • Acme.SalesまたはAcme.Sales.Core - 内部ドメイン/ビジネスロジック

  • Acme.Sales.Entities - 永続層に使用されるデータ・エンティティを。エンティティは、コア(ドメイン)モデルに類似したクラス構造を有するが、より薄いロジック、Id、双方向の関係(ドメインモデルにおける一方向関係とは対照的に)のような追加のプロパティ、およびORMためvirtualメンバーを有する傾向があります上書きできるようにする。このアセンブリはまた、通常のエンティティのCRUD操作のための抽象のリポジトリが含まれます。この名前空間は、実際にEntitiesを永続化するための1つの可能な実装を定義 - ImplLinqToSqlまたはNHibernateのようなものである

  • Acme.Sales.Entities.Implコンクリート抽象リポジトリの実装がここにあります。

  • Acme.Sales.UIには、のいずれかの共通クラスが含まれています。ユーザーインターフェイス - MVP GUIまたはCLIでも可能です。 Entitiesと同じように、これらはCoreクラスに類似ししているが、(ほとんどの場合、今日はDataAnnotationsを介して行われている)、このような検証や書式など、プレゼンテーション固有のロジックと属性を持っている傾向があります。コアライブラリは検証は、しかし、UIの検証、フォーマットやビジネスルールよりも入力のサニタイズについての詳細をする傾向がある必要があることに注意してください。ここでドメインのクラス構造を模倣するのは魅力的ですが、UIモデルのフラットなDTOスタイルのクラスに固執すれば、全体的に簡単になります。

  • Acme.Sales.UI.Services UI ドメイン/永続化層の両方と相互作用することを意図している抽象的または具体的な「サービス」の種類が含まれています。したがって、このプロジェクトはAcme.Sales(ドメイン)への依存関係、Acme.Sales.Entities(抽象リポジトリ)ならびにAcme.Sales.UIを取り、それらの異なる層の間のマッピング活動のすべてを処理します。ここImplがそうでMvpMvcMvvmのようなものである、と

  • Acme.Sales.UI.Impl。実装が意味するとおり、必要に応じてこの名前空間からUIを削除することができます。これは一般にUIプロジェクトに依存しますが、特定のUIモデルに固有のものを追加します。コントローラ、プレゼンター、ビューモデルなどがあります。これが実際の「アプリケーション」です。また、通常はIoCコンテナ(AutoFac、Ninject、Spring.NET、Castle、Unity)を選択し、すべての特定の実装を抽象タイプに結び付けます。

  • アプリケーションプロジェクト内では、論理概念を異なるサブネームスペース/フォルダに分けたいと考えています。たとえば、プレゼンターをPresentersに、Viewsに表示するとかなり簡単です。実際に膨大な数の画面が表示されるようになると、プレゼンターのそれぞれにサブディレクトリーが作成されます(Views.BillingおよびViews.Shippingなど)。ここでトップレベルのAreaディレクトリ/名前空間を作成し、それぞれの領域に別々にPresentersViewsなどを置くこともOKです。これは現在ASP.NET MVCで採用されているアプローチです。

あなたは異なるプロジェクトにPresentersViewsを分離する必要はありませありません。 MVPのためにカスタマイズしたビューは、MVCやMVVMではまったく役に立たず、その逆もありません。実際に再利用されるモデル駆動型アプリケーションの唯一の部分はモデルそのものです。

これは、単一のデータベースと比較的単純なドメインロジックを持つアプリの基本アーキテクチャにすぎないことに注意してください。アプリ統合(Webサービスなど)、イベント(pub/sub)、バッチ処理、CQS、アドホックレポートなどの上位レベルのバックエンド構成は含まれていません。これらは大規模なビジネスアプリではかなり一般的ですが、新しいソーシャルブックマークアプリを使い始めるのであれば、その複雑さは必要ありません。

注:これは、少なくとも中規模のプロジェクトを計画していることを前提としています。あなたやチームが6か月以上働いているとします。あなたが1か月以内にそれを全部試してみたいと思ったら、ソリューションアーキテクチャーにあなたの時間を無駄にしないでください。 1つのプロジェクトにすべて詰め込んで、ドメイン、エンティティ、および UI - の同じクラスを再利用すると、というプロジェクトは簡単に理解して維持することができます。複雑さとメンテナンスのオーバーヘッドを慎重に監視し、プロジェクトが泥の球に変わった場合には、上記の構造にリファクタリングを長時間かけて検討してください。

+0

ビューとプレゼンターが2つの異なるプロジェクトに分かれていない場合、ビューを変更する必要がある場合はどうなりますか?あなたの場合、別のプロジェクトでプレゼンターモデル全体をもう一度書き直す必要があります。代わりに、IViewと一緒に1つのプロジェクトにプレゼンターを持ち、別のプロジェクトでプレゼンターを持つべきです。今では 'mobile.view'、' web.view'などを持っているので、あなたは異なった見解を持っていますが、一つのプレゼンターがそれらを維持しています。 – nawfal

+0

@nawfal:私はすでに最後の箇条書きでそれを扱っています。実際に別のアセンブリに入れておくことをお勧めしたいとは思いません - どちらも本当に再利用可能ですが、名前空間や実際のプロジェクトのどちらを使用する場合でも、実装(Mvp)と型'Views'や' Presenters'など)。 FWIW、私は最近、このタイプをカテゴリとして使用せず、機能または機能領域別に名前空間を使用することを好みました。プレゼンター/ビューモデル/コントローラーは相互に依存しているため、それらを分離しようとすると不必要なオーバーヘッドが加わるだけです。 – Aaronaught

+0

再利用可能です。そうでない場合は、プレゼンター/コントローラーについて考えることに苦労するのはなぜですか?ビューにすべてのUIロジックを書くだけではどうですか?プレゼンターは、Viewのタイプとはまったく関係がありません。代わりに、プレゼンターが実行すべきメソッド/イベントのセットを定義するインターフェース 'IView 'しかありません。さまざまな 'Views'で' IView'のカスタム実装を行うことができます。結局のところ、それはMVPの要点ですね。何か不足していますか? – nawfal

関連する問題