一般に、メソッドを使用してクラスをインスタンス化し、フィールドやプロパティを使用しない場合、多くのオーバーヘッドが発生しますか?
コンストラクター インジェクションを多用する ASP.NET MVC アプリケーションを開発しており、一部のコントローラーにはこれまでに最大 10 個の依存関係があります。しかし、依存関係の数が多いためIMyAppServiceProvider
、MVC 3 の DependencyResolver を介して、すべての依存関係への汎用アクセスを提供するインターフェイスとクラスに頼りました。
アプリケーション固有のコードをすべて取り除き、基本的なセットアップでGistを作成しました (これには、以下で説明する BaseController のセットアップは含まれません)。
を受け入れる BaseController クラスも作成しましたIMyAppServiceProvider
。すべてのコントローラーは、この基本クラスから継承します。基本クラスはIMyAppServiceProvider
オブジェクトを受け取り、さまざまなサービスすべての変数を保護しています。コードは次のようになります。
public class BaseController
{
protected IService1 _service1;
protected IService2 _service2;
protected IService3 _service3;
// ...
public BaseController(IMyAppServiceProvider serviceProvider)
{
_service1 = serviceProvider.GetService<IService1>;
_service2 = serviceProvider.GetService<IService2>;
_service3 = serviceProvider.GetService<IService3>;
// ...
}
}
これにより、コントローラーのコードが「きしむようにきれい」になります。プライベート/保護された変数、コンストラクターでの割り当てはなく、サービスは基本クラスの保護された変数によって参照されます。 ただし、特定のコントローラーがそれらすべてを使用するかどうかに関係なく、すべての要求は、アプリケーションが使用するすべてのサービスをインスタンス化します。
私のサービスは単純で、いくつかのビジネス ロジックとデータベースのやり取りを伴うメソッド呼び出しだけが含まれています。これらはステートレスであり、クラス フィールドやプロパティはありません。したがって、インスタンス化は高速である必要がありますが、これがベスト プラクティスであるかどうか疑問に思っています (これは用語の定義です)。