依存性注入を使用して、両方のフレームワークのコントローラーからサービス クラスやその他の依存性にアクセスする MVC および WebAPI プロジェクトが多数あります。私が抱えている問題は、すべてのサービスを各プロジェクトinternal
に固有のものにしたかったことですが、両方のフレームワークのコントローラー クラスをパブリックにする必要があるため、できません。パラメーターのインスタンスを受信しようとすると、コンパイル エラーが発生します。コンストラクター注入を使用した内部型です。
これは私を何度も噛んだ。これは、コードを呼び出すほとんどすべてのフレームワークで発生します。これは、WebAPI、MVC、さらには WebForms などの Web フレームワークや、テスト クラスも公開する必要があるテストなどの他の種類のプロジェクトで発生します。
一般的なオブジェクト指向についての私の理解では、可能な限りスコープを閉じて、操作する必要のある最小限の機能セットのみにアクセスできるようにする必要があるということです。これは、各クラスに対する他の要素の影響を最小限に抑え、より明確で発見しやすいコードにつながるため、一般的に非常に優れたアプローチだと思います。
私のサービスクラスはまさにそれです。それらは、同じアセンブリ内のコントローラーだけが使用するために作成され、他の誰も使用しません。それらをマークする必要があるpublic
ため、理由もなくそれらを外部の呼び出し元に公開しています。たとえば、FxCop から特定のメソッドを呼び出している人がいない場合、FxCop は警告します。内部クラスですが、プロジェクト (またはソリューション) の外部の誰かがその型を使用してそのメソッドを呼び出している可能性があるため、クラスが public とマークされている場合、それを推測することはできません。
これは明らかにインターフェースにも拡張されます。前述のとおり、依存性注入 (Unity を使用) を使用しており、通常、そのシナリオではサービス クラスごとにインターフェイスがあります。実装自体を内部としてマークできたとしても、インターフェイスを公開する必要があることはまだ理想的ではありません。
内部クラスとインターフェイスをきれいに定義できるようにするパターンはありますが、外部に面したクラスをパブリックにする必要がある外部フレームワークと連携して、彼らが私を呼び出すことができるようにするパターンはありますか? コードのスコープをできるだけ厳密にするには、一般的にどのように進めればよいですか?