いくつかのAPIを表すライブラリのセットを想像してみてください。制御メカニズムの反転を使用することにより、具体的な実装が消費プロジェクトに注入されます。
これが状況です。特定の機能について他のAPIライブラリに依存するAPIライブラリがいくつかあります。したがって、APIライブラリ自体はある時点で結合されます。1つのAPIを変更すると、依存するAPIも変更され、対応する実装も変更する必要があるため、この結合は後で問題になる可能性があります。最悪の場合、かなりの数のプロジェクトが必要になります。そのうちの1つだけからの変更を反映するように変更されました。
今、私はこれに対して2つの可能な解決策を考えています:
関連するAPIライブラリを統合するモノリスAPIプロジェクトを作成します。
各ライブラリが他のAPIに依存するすべての機能のインターフェイスを提供するようにすることで、APIをさらに分離し、直接の依存関係を削除します。これにより、両方のライブラリで同様のコードが生成される可能性がありますが、IoCメカニズムを介して選択された実装に自由が与えられ、APIが互いに独立して改善できるようになります(APIが変更された場合、変更はその実装ライブラリにのみ影響し、他のAPIまたはその実装)。
2番目のアプローチの問題はコードの複製であり、その結果、参照する必要のあるAPIライブラリが多すぎる可能性があります(たとえば、.NETアプリケーションでは、各APIは個別のDLLになります。Silverlightなどの一部のシナリオではアプリケーションの場合、これはアプリのサイズ(ダウンロード時間とクライアントのパフォーマンス全体)の問題になる可能性があります。
状況に対するより良い解決策はありますか?いくつかのAPIライブラリを1つの大きなものにマージする方が良い場合とそうでない場合はいつですか?これは私が尋ねている非常に一般的な質問ですが、期限、見積もり、クライアントの要件、テクノロジーを少し無視して、最大のスケーラビリティと最小のメンテナンス時間の両方を達成することに基づいて適切なアプローチを決定できるようにしたいと思います。それで、どちらかのアプローチ、またはあなたが私に提案するかもしれない別のアプローチを選ぶ良い理由は何でしょうか?
編集:
その質問について何かを明確にしなければならないような気がします。APIを実装から分離するのではなく、APIを相互に分離することを念頭に置いています。したがって、たとえば、アクセス許可を検証するためのセキュリティAPIと、セキュリティAPIを使用(参照)するユーザーアカウントAPIがある場合、セキュリティAPIを変更すると、ユーザーアカウントAPIとその両方の実装を変更する必要があります。このように結合されるAPIが多いほど、より多くの変更を適用する必要があります。それは私が避けたいものです。