私は通常、次の方法でアプリケーションを設計していることに気づきました。
Company.Framework.Persistence.dll
。Company.Framework.Persistence.MSSQL.dll
Company.Framework.Persistence.MySQL.dll
Company.Framework.Persistence.FileSystem.dll
これにより、多くのプロジェクトで非常に大きなソリューションが得られますが、一方で、消費者はニーズに応じて適切なDLL)を選択する機会が与えられます。
単一のDLLと呼ばれるCompany.Framework.Persistence.dll
、消費者は彼が決して使用しないかもしれない多くの戦略をロードしなければならないでしょう。モジュール化されているDLLこの問題を解決します。
これは良い習慣ですか?この設計には欠点がありますか?
このアプローチの長所は、短所をはるかに上回っていると思います。
ここで達成しているのは、I
パターンによるSOLID
のStairway
の完全な「実装」です。つまり、アプリケーションによって異なりますCompany.Framework.Persistence.dll
で定義されたインターフェースの「ダウン」および個々の実装自体も、この抽象化に「アップ」されます。
これは、アプリケーションが実装の詳細から大幅に切り離されていることを意味します(もちろん、通常は、IOCある種のコンテナーを使用して実際のランタイムグラフを作成する必要があります)。既存の画像に恥知らずにリンクしていますStack Overflowの主題に関する別の回答からのこのパターンの例:
本の中で C#による適応コード 作者はこのアプローチについて話し、特に常に実行する必要があるものとしてそれを呼び出しますそれはそのような高レベルのデカップリングを提供するからです。 ( 例 )
別の考えられる利点は、他の実装に影響を与えることを心配することなく、個々の実装にパッチを適用できることです。ただし、これは回帰テストに精通した後は、かなりマイナーな実装です。また、必要なサードパーティの依存関係の特定のバージョンを含むことができるサブフォルダーに個々の実装を展開できることは、おそらくうまく整理するのに役立つでしょう。
このアプローチで私が考えることができる唯一の本当の欠点については、理論的にはCompany.Framework.Persistence.dll
のインターフェイスを(アプリケーションのバイナリと共に)変更し、ランタイムにつながる対応する実装dllを更新することを無視できるということですユーザーのエラー。
過去にこれを正確に行うことで罪を犯してきたので、これは本当にあなたが非常に不注意な場合に起こり得ることだと言えます:)
私もそうします。
プロジェクト/ dllは基本的に無料で、コードを読みやすく、使いやすくします。
私は人々が単一の大きなDLLを使用し、名前空間で区別することを知っています。しかし、彼らが未使用のコードを展開する必要があると言うように、私は実践への利点や多くの欠点などを見ていません。
インターフェースが1つしか含まれていないプロジェクトを回避する場合は、小さなアプリケーションの場合、手抜きをして、具体的な実装をインターフェースに配置するかもしれません。しかし、通常、インターフェイスはモデルに対応しています。だから私は
または(悪いショートカット!)
Obvs、アプリケーションのサイズ/複雑さが増加した場合にインターフェースをリファクタリングするのはかなり簡単です
戦略2の利点は、DLLの地獄を最小限に抑えることです。
通常、Company.Framework.Persistence.MySQL.dllは、MySqlとのインターフェースのためにいくつかのdllに依存します。 MySqlに関心がない場合、MySqlからDLLをダウンロードする必要があるのはなぜですか?
フレームワークが20の異なるストレージプロバイダーをサポートしていたとしましょう。ほとんどのユーザーは1つだけ使用します。したがって、すべてのユーザーは、フレームワークをコンパイルするためだけに使用する19個のDLLを取得および取得する必要があります。
戦略2を実行することで、ユーザーは使用するDLLのみをインストールできるため、DLLの地獄を最小限に抑えることができます。