2017-06-22 8 views
0

はまたここに掲載、ない本当の学問的な答えを: why namespace types should not depend on nested namespaces types?型は、その型を含む名前空間の型に依存しないのはなぜですか?

私はそれを正しく理解していれば、ポイントはProductがための基盤であるため、タイプProduct.Business.Modules.Moduleは、他の方法で回避をProduct.Business.Productに依存するが、できないことですModule。しかし、私のプロジェクト構造を見て、私はこのガイドラインに違反します:

namespace Product.Business 
{ 
    using Modules; 

    class Product 
    { 
     public IEnumerable<Module> Modules { get; } 

     // Module is abstract, with many different kinds defined in Modules. 
    } 
} 

しかし、私は質問を延長したいと思います。

  1. このガイドラインをサポートするためのサポート情報はどこにありますか?
  2. この悪い習慣はなぜですか?
  3. 同じ型の名前空間を持つ他の名前空間の型に型を依存させることは有効ですか? (例えばProduct.Business.SecurityProduct.Business.Modulesに種類に応じて?

意味では、このガイドラインに違反は、円形の名前空間の依存関係の並べ替えを作成しますが、私は、このガイドラインのなぜのよりだけではなく、毛布を理解したいと思います私が見つけることができた唯一の他の情報は、リンクされたMsdnの記事からでした。これは、実際にクラスライブラリのアーキテクチャとレイアウトを大きく変えることができます。

答えて

0

まずは3番目の質問に答えます。あなたはそれに対して何のアドバイスも見当たりませんし、妥当なことと思われます。あなたは論理的に名前空間を区切ります。他の人のse。

ただし、ネームスペースのネストについては、階層を作成しています。仮説的な例として、開発中のデータツールをテストしている企業を考えてみましょう。Company.Dataは、Company.Data.SqlServerが依存する抽象クラスと基底クラスを持ちます。 SqlServerは、包含する名前空間に抽象的な要素を具体的に実装しています。フィードバックや、別のデータベースシステムをサポートする必要があるため、保守性のために、SqlServerクラスを別のライブラリに移動することに決めました。

新しいアセンブリリファレンスをオリジナルのCompany.Dataにしてから続行するのは簡単です。 Company.Dataのクラスは、何も変更されていないかのように処理されます。しかし、含まれているネームスペースやそのクラスに依存している場合は、Company.Dataが破損します。それは、懸念を分離する目的を打ち破ります。つまり、彼らがMySQLをサポートするための製品を作ったら、Company.Data.MySqlCompany.Data.SqlServerに依存するでしょう。

Provider Model design Patternなどの手法はもはや不可能または実行可能になりません。