web-dev-qa-db-ja.com

デスクトップアプリケーションおよびWebプロジェクトで使用される可能性のある共有ライブラリの作成

私は過去1年ほどの間、私たちの会社で多数のMVC.NETおよびc#デスクトッププロジェクトに携わってきましたが、他のプロジェクトにも(もちろん、読み取り専用の学習能力で)突っ込んでいました。

このことから、さまざまなプロジェクトやチームにわたって、優れたインターフェースや抽象化に対してうまく設計された多くの機能があることに気づきました。私たちは時々私たち自身の仕事を好む傾向があるので、私はいくつかのプロジェクトがまったく同じクラスを持っていることに気付きました、メソッドは明らかにそれで働いていたので、それにコピーされたので新しいプロジェクトに簡単に移動されました(おそらく同じ開発者によってもともとそれを書いた)

この事実については、時折プログラマーミーティングの1つで触れ、この機能の一部を企業のコアライブラリに組み込んで、長期にわたって構築して複数のプロジェクトで使用できるようにすることを提案しました。誰もが同意し、私はこの可能性を検討し始めました。

しかし、私はかなり早い段階で障害に遭遇しました。現在、私たちのチームは主にMVCに焦点を当てており、プロジェクトは主に2.0にありますが、3.0に分岐し始めています。また、いくつかの共有クラスや基本的なヘルパーメソッドの恩恵を受ける可能性のあるデスクトップアプリケーションもいくつかあります。

最初にこのDLLを作成するときに、すべてのプロジェクトタイプ(Web、クライアントなど)で使用できる共有クラスをいくつか含めましたが、MVCアプリケーションでのみ役立つ共有モジュールの追加を検討し始めました。ただし、これにより、作成中のクラスの一部(この段階ではMVC 2.0)を活用するために、Microsoft Web DLLへの参照を含める必要がありました。

さて、私の問題は、クライアントアプリケーションでも使用できるWeb固有のライブラリへの参照を持つ共有DLLがあることです。それだけでなく、DLLは最初はMVC 2.0を参照しており、最終的にすべてのプロジェクトでMVC 3.0に移行します。しかし、このライブラリのクラスの多くはまだMVC 3などに関連していると思います

このDLL内のコードは、次のような独自の名前空間に分けられます。

  • CompanyDLL.Primitives
  • CompanyDLL.Web.Mvc
  • CompanyDLL.Helpersなど

だから、私の質問は:

  1. このような共有ライブラリを実行してもよろしいですか、それともWeb固有の機能がある場合、特定のフレームワークまたはMVCバージョンのみを対象とする別のWeb DLLを作成する必要がありますか?
  2. 問題がなければ、たとえばMVC 3プロジェクトでMVC 2を参照するライブラリを使用するときにどのような問題が発生する可能性がありますか。ある種の互換性の問題、またはライブラリを使用する開発者がMVC 2.0ライブラリが必要であることに気付かない問題に遭遇するかもしれないと私は考えています。彼らはいくつかのジェネリッククラスなどを使いたいだけかもしれません

コンセプトは当時は良いアイデアのように思われましたが、多分それは本当に実用的な解決策ではないかもしれないと考え始めています。しかし、証明済みテスト済みのコードであるため、プロジェクト間でコピーされたクラスとメソッドを目にした回数は、完全に正直であるとは少し不安です!

[〜#〜]更新[〜#〜]:私が乗ったBernardsの回答に加えて、良いアドバイスのようです。ただし、MVC 2プロジェクトとMVC 3プロジェクトの両方でおそらく役立ついくつかの共有クラスを作成したいと思います。ただし、共有アセンブリは、最初に共有クラスを作成するために、MVCフレームワークの1つを参照する必要があります。

上記の第2四半期をさらに詳しく説明します。

  1. MVC 3 Webソリューションが必要な場合、MVC 3を具体的に参照するCompanyDLL.Web.Mvc3プロジェクトを共有する必要がありますか?これは、CompanyDLL.Web.Mvc2ソリューションからこの新しいMvc3共有プロジェクトにすべてのコードをコピーすることを意味しますか?

共有アセンブリの作成、および異なるフレームワークバージョンに対するビルドと参照のスキルが不足しているようです基本。または、それを吸い込んでCompanyDLL.Web.Mvc2CompanyDLLを作成するのと同じくらい簡単かもしれません。 Web.Mvc3CompanyDLL.Web.Mvc4などのライブラリ...

8
dreza

異なるプラットフォーム(デスクトップとWeb)に個別の共有ライブラリを作成します。これらのライブラリの両方が必要とするものは何でも、別の共有ライブラリに入れる必要があります。したがって、これらのライブラリを次のように分割できます。

  • Company.Core:すべてのライブラリで使用されます。どのプラットフォームにも固有ではない、汎用コード、ヘルパークラスなどが含まれています。他の共有ライブラリを参照しません。
  • Company.Core.Desktop:デスクトップアプリケーションで使用されます。参照Company.Core 図書館。
  • Company.Core.Web:Webアプリケーションで使用されます。参照Company.Core 図書館。

これにより、使用中のデスクトップテクノロジーに影響を与えることなく、使用中のWebテクノロジーを変更できます。これにより、将来的にプラットフォームを追加することもできます(例:Company.Core.Mobile)。

これらのライブラリがユニットテストされていることを確認し、プロジェクト間でコードをコピーしないでください。

5
Bernard