12

私は、クライアントとサーバー用の2つのソリューションを含む.net c#アプリケーションで作業しています。サーバー側には、次のアーキテクチャレイヤーを分離するために使用された80以上のプロジェクトがあります。

  • インフラストラクチャレイヤー
  • 統合レイヤー(外部システム)
  • ドメインレイヤー
  • リポジトリレイヤー
  • マネージャーレイヤー
  • サービスレイヤー

さらに、ほぼすべてのレイヤーにテストプロジェクトがあります。現在、ソリューションのビルド時間は2〜3分で、多くの開発者(私を含む:))はこの問題に取り組む必要があると感じています。

したがって、提案された解決策は、プロジェクトをマージすることによってプロジェクトの数を減らすことでした。私の考えでは、ビルド時間を最小限に抑え、私たちが望むものを達成することができたのはおそらく良い解決策です。

提案された解決策は、プロジェクトを3つの領域にマージすることです。たとえば、本番コード用の1つのライブラリ、テストコード用の1つのライブラリ、および展開プロジェクト(WCFホストなど)用の1つのライブラリと、名前空間を分離することによって同じプロジェクト内の論理的に分割されたレイヤーです。

しかし、私の懸念は

  1. これらの分離は保守性に良いでしょうか?各名前空間appoxにその数百のクラスを提供します。
  2. ヘルパーなどの共通の機能がある場合、それらをどこに配置しますか?

ソリューションを階層化する他の方法はありますか?

4

4 に答える 4

4

ソリューションを論理レイヤーに分割する必要があると思います。

どこにヘルパーを配置しますか。最も低いレベルの1つで、その解決策を作成します。

ファーム用のソフトウェア。あなたはあなたの動物、野菜を追跡する必要があります。動物に餌を与えるためのモジュールと、動物や野菜を消費者市場に販売するためのモジュールが必要です。

これは、次のソリューションに分割できます

バックエンド

  • 販売モジュール:あなたの製品を販売するためのすべて
  • モジュールの購入:種子、動物用食品、その他の製品の購入、..。
  • Shedulerモジュール:種まき、収穫、...のトリガーイベント
  • 予測モジュール:天候や市場価格による収穫量の予測...
  • ..。

これらの各バックエンドモジュールは、独自のデータアクセス層、DTO、WCFサービスなどを持つことができます...

このソリューションには、ビジネスロジック、データアクセス、...のみが含まれます。また、これらのバックエンドソリューションに接続する複数のフロントエンドソリューションが存在する可能性があります。

フロントエンド

  • ASP.NET MVCアプリケーション:消費者に販売するためのWebショップ
  • WPFアプリケーション:販売の承認
  • その他のWPFアプリケーション:物を買う。
  • モバイルアプリケーション:イベントを携帯電話などに送信します。
  • (別のオプションは、2つ以上のバックエンドソリューションを1つのフロントエンドソリューションに接続することです)
  • ..。

これはプロジェクトにとって大きな変更であり、影響があります。変更したくない場合は、これが正しいと思うようにしてください。

複数のソリューションを使用すると、全体的なビルド時間が長くなります。すべての開発者がローカルマシンですべてのソリューションをビルドしなくても、常に最新のバイナリで作業できるように、ナイトリービルドを行うことが重要です。

さまざまなソリューションでレイヤーを引き続き使用できることに注意してください。

  • インフラストラクチャレイヤー
  • 統合レイヤー(外部システム)
  • ドメインレイヤー
  • リポジトリレイヤー
  • マネージャーレイヤー
  • サービスレイヤー

これをすべて一緒に機能させ、バイナリを台無しにしないため。ドライブIEXをマップできます。ここには、フォルダーバイナリがあり、各ソリューションのフォルダーがあります。ここで、各ソリューションはビルド後のイベントでアセンブリをコピーします。(これをスクリプト化するので、すべてのマシンで動作します)

優れたネットワークインフラストラクチャがある場合は、それをサーバーにコピーすることもできます。そのため、たとえばTFSですべてのソリューションを構築すると、すべての開発者がアクセスできる場所にソリューションをコピーできます。

TFSでビルドする場合は、ビルドの順序が正しいことを確認してください。最初は最下位レイヤー、最後は最上位レイヤーです。

ただし、ソリューションを分割すると、ソリューションではすべてのソリューションでそれらが必要になるとは限りません。

私は最近オニオンアーキテクチャについての記事を読みました、多分あなたもそれを見ることができます。(ASP.NET MVCに固有です)。

CQRSを調べることもできます。

于 2012-10-19T07:32:44.500 に答える
4

アプリケーションに6つのレイヤーしかないのに、なぜ80以上のプロジェクトがあるのですか?

それらは多数の機能領域をカバーしていると答えるかもしれませんが、そもそもこれらすべての機能領域を1つのソリューションに含める必要がありますか?

アーキテクチャ部門をプロジェクトに、機能部門をソリューションに反映させることをお勧めします。異なるソリューションで同じプロジェクトを再利用できます。このようにして、再利用可能なアーキテクチャレイヤーごとに1つのプロジェクトがあり、機能領域と同じ数のドメインプロジェクトがあります。

于 2012-10-19T13:32:07.937 に答える
2

私は間違いなくプロジェクトをマージしません...開発者が(意図するかどうかにかかわらず)取るべきではないショートカットを使用すると、各レイヤーにスパゲッティコードがすぐに表示されると思います。

レイヤーを別々のソリューションに分離する傾向があります...そして、層全体のプロジェクト参照の代わりにバイナリ参照を使用します。ただし、これは分岐で大混乱を引き起こす可能性がありますが、注意してください。

プロジェクトを共通の場所にビルドすることでビルド時間が短縮されるのを見てきましたが、これにより、必要のないときにVSがプロジェクトを再構築できなくなる可能性がありますが、これが正しいかどうかはわかりません。

ここにいくつかのアイデア:http://blogs.microsoft.co.il/blogs/arik/archive/2011/05/17/speed-up-visual-studio-builds.aspx

最後に....フルビルドの3分ですか、それとも1つのプロジェクトの単体テストだけですか?最大の問題である方に焦点を合わせます。単体テストに時間がかかる場合は、依存関係に問題があります。完全なソリューションに時間がかかる場合は、ビルドサーバーを入手して、単体テストの開発時間を短縮することに集中してください。

お役に立てば幸い

于 2012-10-19T07:16:36.713 に答える
1

私が過去にそのような問題に対処した影響の少ない方法は、プロジェクトの1つとそのテストプロジェクト(およびおそらくプロジェクトの依存関係)のみを含む一連のソリューションファイルを作成することです。次に、NCrunchのようなツールを入手し、おそらくTDDを使用して、これらのソリューションでコーディングのほとんどを実行します。これにより、非常に高速なフィードバックループが実現し、階層化された分離アプローチの精神に基づいています。過去にこれを行ったとき、実際にはアプリケーション全体を1日に数回しか実行しておらず、とにかく赤緑リファクタリングに大きく依存していることがわかりました。

必要に応じて、これらの小さなソリューションファイルをソース管理する必要はありません。開発者は独自のファイルを作成でき、境界線を捨てることができます。

もちろん、これは決して万能薬ではなく、アプリケーションを実行したいときにコンパイル時間が長くなるという問題に対処することはできませんが、優れた設計/開発の実践を促進しながら、フィードバック時間を短縮するのに間違いなく役立ちます。リスクが非常に低く、セットアップが高速であるという利点。

于 2012-10-19T20:34:31.860 に答える