Visual Studioソリューションのグッドプラクティス[終了]


10

うまくいけば、相対論の簡単な質問です。私は建物内の修理されたデバイスの扱いやすさを作成するための新しい内部プロジェクトに取り組んでいます。

データベースはリモートでウェブサーバーに保存され、ウェブAPI(JSON出力)を介してアクセスされ、OAuthで保護されます。フロントエンドGUIはWPFで、ビジネスコードはC#で作成されています。

これから、プレゼンテーション/アプリケーション/データストアのさまざまなレイヤーがわかります。APIへのすべての認証済み呼び出し、エンティティ(ビジネスオブジェクト)を表すクラス、エンティティ(ビジネスオブジェクト)を構築するクラス、WPF GUIのパーツ、WPFビューモデルのパーツなどを管理するためのコードがあります。

これを単一のプロジェクトで作成するのが最適ですか、それとも個別のプロジェクトに分割するのが最適ですか?

私の心の中でそれは複数のプロジェクトであるべきだと言います。私は以前に両方の方法でそれを行っており、単一のプロジェクトソリューションを使用するとテストが簡単になることがわかりましたが、複数のプロジェクトを使用すると、再帰的な依存関係が発生する可能性があります。特に、クラスにテストを容易にするためのインターフェースがある場合、問題が発生する可能性があることがわかりました。


1
それらをプロジェクトにとって意味のあるものに分離します。
ラムハウンド、2011年

MattDaveyが示唆したように、他の誰かがインターフェイスを保持するためのプロジェクトに関する考えを持っていますか?前述の依存関係を回避するために、以前このアプローチを使用しました。または、クラスxのインターフェースがクラスxと同じプロジェクトにある必要があります。
JonWillis、2011年

また、どのレイヤーを使用していますか?主なものはプレゼンテーション/アプリケーション/インフラストラクチャですが、いくつかの異なる種類を見てきました。アプリケーションをアプリケーションとサービスの2つの部分に分割するものもあります。一部のモデルでは、ビジネスロジックの特定のレイヤーについても言及しています。これは、ビジネスオブジェクト自体に含めることができます。
JonWillis、2011年

回答:


8

プロジェクトの規模によって異なります

これが私がよく使うガイドラインです

  • ほんの一握りのページかそれ以下の小さなプロジェクトで、私はほとんど常に単一のプロジェクトを続けます。

  • 小さなプロジェクトのデータアクセスレイヤーが大きいか複雑な場合は、それを独自のレイヤーに分離することがありますが、それ以外の場合は独自のフォルダーに配置されます。

  • プロジェクトが大きい場合、ほとんどの場合、DAL用の個別のプロジェクトがあり、それ以上の分割は、アプリケーションの機能間の境界がどこにあるかに依存します。

  • アプリケーションに複数の目的があり、それぞれに独自のビュー、ビューモデルなどがある場合、通常は各部分を独自の領域に分けます。各セクションが小さい場合は、フォルダで区切ります。各セクションが大きい場合は、プロジェクトごとに分けます。

  • 私は、オブジェクト(の同じセット参照する必要がある複数のプロジェクトがある場合ViewModelBaseRelayCommandなど)を、私は共有インフラストラクチャオブジェクトのためのプロジェクトを作成します。

  • 共有するカスタムスタイル/テンプレート/リソースが大量にある場合は、それらのためにプロジェクトを作成します。

補足として、私は最初の大きなWPFプロジェクトでミスを犯し、モデルを1つのプロジェクトに配置し、ビューを別のプロジェクトに配置し、ViewModelsを3番目のプロジェクトに配置することでそれらを分離しました。メンテナンスが悪夢になるので、今はそれが道ではないことを伝えることができます:)


奇妙なことに、レイヤーを分離することでどのようなメンテナンスの問題がありましたか?
Ian

@レイチェル、私はWPFを使用します。そのため、プロジェクトをどのように編成したかを知りたいと思います。3つのパーツを3つのDLLに分割するときに、小さなMVCプロジェクトが面倒だったことを覚えていると思います。WPFの場合、MyビューはGUI、変更するエンティティ/ビジネスオブジェクト、ViewModelはそれらの間の相互作用になります。ViewModelは、修復をロード/保存するためにリポジトリを呼び出すロジックを処理します(修復にはファクトリ/ Web APIなどがあります)。
JonWillis、2011年

1
@Ian最大の問題は、単一のフィールドを追加するなどのほとんどのマイナーな変更により、4つの個別のライブラリでモデル、ビュー、ビューモデル、およびDALを探す必要があったことです。当時私が作業していたプロジェクトはかなり大きく、特定のファイルを探すよりも多くの時間を浪費していました。それ以来、私は例のもののような検索関連のために、一緒に関連するオブジェクトを保つに変更したSearchViewSearchViewModelと、SearchResultModelすべてのフォルダにまとめられると私はそれを維持するためにアプリが簡単になりました。
Rachel

@Ian私はリファクタリングするまで、私はいくつかの醜い回避策を持っていたので、私はまた、依存関係の問題を有するために私の最善の努力にもかかわらず、循環参照に参照他の人に必要ないくつかの層を実行しているが、その層がそれらを参照してリコール
レイチェル・

1
@JonWillis私のWPFプロジェクトのほとんどは、私の回答で指定されたポイントに基づいて分割されています。通常、DALは独自のレイヤーであり、プロジェクトの各モジュールまたはセクションは(プロジェクトのサイズに応じて、独自のフォルダー、名前空間、またはプロジェクトに)グループ化されます。したがって、たとえば、Interfaceデータレイヤーのを含むすべての検索オブジェクトは一緒になりますが、検索の実際のデータアクセスレイヤーはDALライブラリにあります。多くの場合、共通の基本クラス、インターフェース、ヘルパークラスを含むInfrastructureor Commonライブラリがあります。
Rachel

14

レイヤーごとに1つのプロジェクトに加えて、レイヤーごとにテストプロジェクトを使用すると、最良の結果が得られます。ソリューションがすべてを網羅するソリューションでは、10以下のプロジェクトでは達成できないアプリケーションをいくつか見ました。

ネームスペースが本当に必要なプロジェクトを使用するという罠に陥らないでください。大量のプロジェクトを追加しても、オーバーヘッドが増えるだけで利益は得られません。


9

私見の分離はほとんど常により良いです。プロジェクトが100%自明でない限り、ほとんどの場合、データレイヤーを分離します。その理由は、データレイヤーが最も頻繁に渡される傾向があるためです。まれに、GUIを複数のデータレイヤーに接続して、正常に機能することを期待します。より一般的なシナリオは、単一のデータレイヤーがあり、それを複数のGUI(ASP.Net、WPF、Silverlightアプリなど)に分散させたい場合です。データレイヤープロジェクトをビルドし、そのDLLを次のGUIのリファレンスとして参照として追加できるのは素晴らしいことです。


+1新しいプロジェクトを開始するとき、メモリにデータを保持するシミュレーションデータレイヤーを作成することがよくあります。最初にアプリの残りの部分を構築することができます。それから私は「本物」のデータアクセス層、後で...のためにそれを交換することができます
MattDavey

Webサーバーとの通信に使用されるエンティティ(DTO)、ファクトリー、およびクラスをすべてデータレイヤーの一部と見なしますか?
JonWillis、2011年

@JonWillis-いいえ、おそらくすべてではありません。Webサーバーのファクトリとクラスをクラスライブラリプロジェクトの名前空間に配置します。私の典型的なデータレイヤーには、必要なdbmlファイルやedmxファイルのみが含まれています。ただし、原則として、「ライブラリ/フレームワーク」のものには独自のプロジェクトを割り当てます。GUIプロジェクトでそれらを投入する必要はありませんが、人々はいつもそうしているようです。
Morgan Herlocker、2011年

ただし、現実的には、いくつかの名前空間を取得して、それらを新しいプロジェクトに分岐するのにどのくらいの時間がかかりますか。かなり簡単なリファクタリングの仕事だと思います。
Didier A. 14年

4

私にとって、4 *はマジックナンバーです。各層に1つのプロジェクト、およびそれらの間の通信に必要なすべてのインターフェース/ DTOを定義する1つのプロジェクト。

* 7単体テストをカウントした場合


2

これらの異なるレイヤーで作業している場合、またはそれらと緊密に結合している場合は、常に単一のソリューションを使用してきました。F5キーを押して、必要に応じてすべてのプロジェクトを再構築してもらいたいです。それを行う「正しい」方法はないと思います。


2

その個人的な好み、最も重要なことは一貫していることです。個人的には、アプリケーションの各レイヤーに個別のプロジェクトがあるので、分離は明らかです。


どのレイヤーに分離しますか?個別のアプリケーション/サービスレイヤーがありますか?そうであれば、実際にはどのように異なりますか?ビジネスロジックはアプリケーション/サービスに含まれていますか、それとも実際のビジネスオブジェクトのメソッドですか?
JonWillis、2011年

1

プロジェクト数の増加は、単体テストを有効にし、依存関係グラフを単純化して、物事がそれほど複雑ではなく、アプリの一部に変更を加えると、アプリの無関係に見える部分の物事が壊れてしまうことに関係しています。

何らかの依存関係の逆転を行っているときに、すべての「コントラクト」、インターフェース、抽象クラス、データ転送オブジェクトを1つのアセンブリに配置することがうまくいきます。別のアセンブリでは、データベースと通信するものは何でも入れます。単体テストは独自のアセンブリを取得します。UIが根本的にテスト不可能な場合(ASP.NET winformsなど)、UIをテスト可能なコードとテスト不可能なコード(それぞれアセンブリ)に分割することには大きなメリットがあります。データベース、UI、またはこれまでに説明したこととは何の関係もないコードが表示され始めることがあります。これは、.NETフレームワークにあると思っていたコードです。そのコードをユーティリティアセンブリに配置するか、少なくともルートアセンブリ(おそらくインターフェイスを持つもの)に配置します。

すべてのアセンブリがすべてのアセンブリを参照する場合、またはほぼ参照する場合は、それらを1つのアセンブリにマージして戻す必要があります。データ層のコードをUIに配置し、UIをデータ層に配置することを防ぐ規律が欠けている場合は、すべてを1つのレイヤーにマージすることで、物事を簡素化します。

Visual Studioの一部のエディションでは、約15のアセンブリでパフォーマンスの問題が発生します。場合によっては、プロジェクトの種類によって異なります。ただし、プロジェクトファイルを戦略的にアンロードすると役立つ場合があります。


現時点では、私がこの会社の唯一の開発者です。また、大学を卒業したばかりなので、より良いプロジェクトにできるだけ早く良い実践を浸透させるようにしています。システム仕様を文書化し始める前にシステム仕様が大幅に変更されたため、システムをできるだけ早くしたいという要求に対して、それを保守可能にすることに興味があります。あなたの意見では、インターフェースのみを含むアセンブリは適切なソリューションでしょうか?このようにして、依存関係はインターフェースとファクトリー・クラスのみに依存する必要があります。
JonWillis、2011年

1
はい。アセンブリの分割の動機を理解する方が良いですが、あなた(またはあなたのチームメンバー)がそれを理解しない場合でも、それはまだ安価な操作です。したがって、すべてのアセンブリがすべてのアセンブリに依存し、ユニットテストの希望がない場合でも、コントラクト(インターフェイス、抽象クラス)のように動作するものを独自のアセンブリに移動することは、正しい方向への一歩であり、欠点はほとんどありません。
MatthewMartin、2011年

-2

複数のプロジェクトを作成する唯一の正当な理由は、複数のアプリケーション間でクラスとファイルのセットを共有する必要がある場合です。

プロジェクトが1つのアプリケーションだけで使用されている場合、そもそもプロジェクトは作成されるべきではありません。代わりに名前空間を使用してください。ファイルを探すときの循環参照、dllオーバーヘッド、およびプロジェクトの混乱の問題を自分で解決してください。

その理由の詳細については、この記事を読んでください。http//lostechies.com/chadmyers/2008/07/16/project-anti-pattern-many-projects-in-a-visual-studio- solution-file /

また、記事で述べているように、アプリケーション全体でコードを共有する以外に複数のプロジェクトを作成する正当な理由がある場合は、それが何かを教えてくれる人を歓迎します。


反対票に関する反対意見はいただければ幸いです。
Didier A.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.