6

core.xml.dll と core.string.dll という名前の 2 つのアセンブリ (とりわけ) を含む再利用可能なクラス ライブラリを設計しています。

xml アセンブリは、いくつかの文字列ヘルパー メソッドを使用するために、文字列アセンブリを参照します。

ただし、xml アセンブリに含まれるメソッドを使用することでメリットが得られる文字列メソッドが存在するようになりました。

文字列アセンブリから xml アセンブリを参照すると、循環依存関係が作成され、ソース コードから両方のアセンブリをビルドできなくなります。(つまり、ニワトリと卵の問題)。

「自分自身を繰り返さない」という原則に従うために、両方のアセンブリで機能が重複することを避けたいと思います。実装にバグが見つかった場合は、1 か所だけ修正したいと考えています。

アセンブリを 1 つにマージすることはできますが、アセンブリの結合性が低下するため、これは理想的ではありません。

特定のクラスにわずかな変更を加えるだけで、アセンブリ全体を再構築して再展開する必要があります。また、最終的には、非常に多くの依存関係があるため、1 つの巨大なライブラリ アセンブリになってしまう可能性があります。

では、再利用可能なライブラリ アセンブリのセットのコンテキストでは、ここで使用する最善の方法は何でしょうか? また、.NET フレームワーク自体はこの問題にどのように対処していますか?

(Reflector では、System.Configuration.dll が System.XML.DLL を参照しているように見えます。逆もまた同様です。これは実際に正しいのでしょうか?もしそうなら、循環依存関係はどのように管理されていますか?)

4

4 に答える 4

6

ナイフに同意します。円形の依存関係はデザインの匂いです。容赦なくリファクタリング!

ビジネス オブジェクトが密結合している場合、これは困難な場合があります。ほとんどの場合、これは依存性注入によって解決できます。

疑似 C++ の例:

class Employee {
    Company company;
};

class Company {
    vector<Employee> employees;
};

トリッキー?必ずしもそうではありません:

template<class CompanyT>
class Employee {
    CompanyT company;
};

class Company {
    vector<Employee<Company> > employees;
};

より高いレベルに依存する必要があるよりプリミティブな型は、その契約を満たす限り、他​​のあらゆる種類の型と連携するように抽象化できます。

于 2009-03-08T04:15:48.513 に答える
3

3番目のアセンブリが必要なようですね...

于 2009-03-08T04:06:49.673 に答える
3

xmlアセンブリで定義されている拡張メソッドにします(コメント「XMLを受け入れて文字列ベースの形式に変換する変換メソッド」に基づいて)。xml を扱っています。Linq が IEnumerable に対して行うのと同じように。

于 2009-03-08T04:18:08.587 に答える
3

String ライブラリに XML ライブラリが本当に必要な場合は、おそらく、String ライブラリを下位レベルのデータ型定義と「コア ユーティリティ」(可能であれば外部依存関係なし)、および別の上位レベルにリファクタリングする必要があることを示しています。 XML、SQL、正規表現、またはアプリケーション層で役立つと思われるその他のものを取り込む可能性のあるライブラリ。

于 2009-03-08T04:18:24.157 に答える