2009-06-30 2 views
3

タイトルによれば、私はマルチプロジェクトの解決策を得ています。ASP.NET + C#マルチプロジェクトソリューション。グローバルなユーティリティ機能はどこに置くべきですか?

私は他のプロジェクトの大部分がロードされている "コア"プロジェクトを持っています。

だから私の質問はこれです、私は私がどこからでも、次のようにアクセスできるようにしたいと思い、このようなFormatPhoneNumber(..)など、いくつかのユーティリティ関数を持っています。

(Project_Bにコアに依存する)

string str = FormatPhoneNumber(inputString); 

最悪の場合、私はある種の修飾子と一緒に暮らすことができたとします

string str = util.FormatPhoneNumber(inputString); 
+0

あなたが気づいていないかもしれないものとして、プロジェクトフォルダを作成できます(ディスク上のフォルダにマップすることもできないこともあります)。私はUtilsのライブラリをUtilsフォルダに入れ、ServiceライブラリはLibフォルダに入れます。 –

+0

これに答える時間を寄せてくださったみなさん、ありがとうございました。 –

答えて

4

これを行うための最善の方法を作成することですdllプロジェクト(「CommonCode」のようなものかもしれません)は、他のすべてのプロジェクトからこのdllを参照し、その中のクラスとメソッドにアクセスできるようにします。

あなたは、例えば、どこかで(あなたはそれを呼び出すように)「修飾子」のいくつかの並べ替えを持っているが、各ファイルの先頭にusingステートメントを使用する影響を軽減する必要があります

using util; 
+0

私はむしろ、「使用しないでください」という一般的なガイドラインとして言うでしょう。特に、このように無関係なユーティリティクラスのセットをインポートする場合。あなたは長い名前のためにIntellisenseを持っています。それ以外は、あなたの答えは大丈夫です。 – OregonGhost

+0

私は通常、ネームスペースの外に本当のutilsを残すことを好む - .NETクラスへの拡張はここでも普通にカウントされます – annakata

0

あなたがC#3.0を使用している場合は、拡張メソッドとしてそれらを使用する1つの静的クラスにそれらのすべてをバインドすることができます。

+0

しかし、拡張メソッドを使うべきときのガイドラインに注意してください:もしそれがターゲットクラスのメンバに属するターゲットタイプを自分で書く)。 – Richard

+0

あなたはまだそれらをクラスのどこかに入れてプロジェクト間で共有する必要があります。拡張メソッドは、あなたの名前空間ともちろん参照を使用していない限り動作しません。また、自分自身を拡張メソッドに限定することによって、独自のデザインはできません。人々はクラスを必要とします。 – Kobi

+0

私は、文字列をフォーマットする文字列拡張メソッドは良いと思います。特に、唯一のパラメータと戻り値の両方が他の型のものである場合、別のクラスで排他的に使用される関数用に別のクラスを持つことには意味がありません。 – OregonGhost

0

.NETにはグローバル関数がないため、ユーティリティ関数をクラスに追加する必要があります。あなたはユーティリティクラスをインスタンス化することなく、それらを呼び出すことができますので、あなたは、メソッドが静的にすることができます。

public class Utility 
{ 
    public static string FormatPhoneNumber(string input) 
    { 
    ... 
    } 
} 

// usage: 
string output = Utility.FormatPhoneNumber(input); 

他のすべてのライブラリで、あなたのコアライブラリを用いることができる別のユーティリティライブラリ(参照)にこれらのメソッドを置きますおよびアプリケーション。

0

静的クラスに関数を配置する必要があります。あなたは(何のグローバル関数をC#ではありません)資格を回避することはできません。

<%= Formatters.PhoneNumber(rawData) %> 

ユーティリティ機能は、通常のメソッドごとにグループ化する必要があります。同様の方法は一緒に行く、無関係な方法は、静的クラスと異なるクラス(イベントに行くべき低結合と高凝集を目指す)。

それぞれが明白であるべきで所属アセンブリ:唯一のプレゼンテーション層(ASP.NETプロジェクト自体を)で使用する書式設定機能が属しています。本当に一般的な機能がコアになる可能性があります。

1

あなたは本当に(あなたはいけない、知っているが、時にはそれが最高/最も簡単な解決策はあります)、私はどちらかのコア(一つ一つのプロジェクトがコアに依存していると仮定して、それらを持つことをお勧めなユーティリティ機能を持っていなければならない場合とにかく)、または別のユーティリティー・アセンブリーに入れてください。別のアセンブリを周りに置かない場合は、ILMergeの使用を検討してください。

修飾子はまったく問題ありません。無関係の機能をUtilsクラスに入れないでください。すべての書式設定関数のクラスはFormattingです。一方、s_ruchitが示唆されているように、拡張メソッド(例えば、文字列クラス用)も便利になるかもしれません。

(私はそれが代わりにBLOCKQUOTEを作成するため、この§の%$ &値下げエディタは、ドイツ語のキーボードレイアウトの[時]記号を入力することはできませんこと?ため息言及しました。)

1

、独自のutilを作成してみてくださいとしょうかん。
クラスライブラリプロジェクトを作成し、utilクラスをそこに配置します。

私は自分自身[のcompanyName] .Utilのような命名規則を遵守してみてください。[サブドメイン] あなたの例では、おそらく私の[会社名] .Utils.StringHelpersに

に合うあなたは、その後で静的クラスStringHelperを作成します静的メソッドFormatPhoneNumberです。 これらの個人用ライブラリが急速に大きくなることがわかります。それらをグループ化することにより、関数のサブセットのみが必要な場合は、すべてのコードをロードする必要はありません。

0

実装している関数がアプリケーションのコンテキストでのみ使用できる場合は、コアアセンブリ(たとえば「Utils」のような別の名前空間)に配置するか、新しいDLLライブラリを配置することをお勧めしますアプリケーションソリューション。 この関数を複数のプロジェクトで使用できる場合にのみ、ユーティリティライブラリを作成することは理にかなっています。しかし、それが定期的に維持されていれば、ユーティリティライブラリは意味をなさないということを常に心に留めておいてください。

0

これらのメソッドにすべてのコードをアクセスさせたい場合は、拡張メソッドを使用してください。それ以外の場合は、コアアセンブリでUtilクラスを使用します。

FWIWは、あなたが使用してキーワードを省略することができますボリスsugguests(競合を避けるために推奨)などのより正式な名前空間従っている場合:

using Util = [CompanyName].Utils.StringHelpers; 

を私はDRY principleに従い、できるだけ早くエイリアスを作成する傾向があります私は一回以上それが必要です。

1

拡張メソッドを使用すると、クラス名を使用せずにメソッドを簡単に呼び出すことができます。

public static class Util { 
    public static string FormatPhoneNumber(this string input) { 
     : 
    } 
} 

メソッドはすべての文字列オブジェクトに表示されます。それはどのクラスから来るのかを知る必要はありません。ただし、拡張クラスが別の名前空間で宣言されている場合は、引き続き名前空間をインポートする必要があります。

string formattedString = inputString.FormatPhoneNumber(); 
関連する問題