0

Castle WindsorをIOCとして使用して依存性注入を使用しています。しかし、コントローラクラスのコンストラクタに少数のアプリケーションサービスを注入した場合や、これらのアプリケーションサービスのコンストラクタに多数の項目が注入されている場合は、コントローラの動作に時間がかかりすぎる(20秒)。ASP.Net MVCコントローラのコンストラクタの初期化に時間がかかります

ここでいくつかの堅牢なソリューションをお助けください。

ありがとうございます!

更新 アプリケーションサービスの1つのコンストラクタに20個のリポジトリと15個のアプリケーションサービスが組み込まれています。

私は、A、B、Cの3種類のアプリケーションサービスを提供しています。ここでは、 のコンストラクタには、そのコンストラクタに25個のアイテム(20のリポジトリと5つのアプリケーションサービス)が注入されています。 コンストラクタBのコンストラクタは、コンストラクタ内に注入された35個のアイテム(25のリポジトリと10のアプリケーションサービス - そのうちの1つはCです)がAのコンストラクタ のコンストラクタに注入されています(20のリポジトリと15のアプリケーションサービス - 2つはBとCです)。そのコンストラクタ

したがって、Cのコンストラクタは3回(実際は5回)初期化されています。このカスケード効果が問題の原因です。少なくとも、それは私の考えです。

これに関するご提案はありますか?

+1

解決策は、[注入コンストラクタがシンプルであること]を確実にすることです(http://blog.ploeh.dk/2011/03/03/InjectionConstructorsshouldbesimple/)。 – Steven

+0

あなたは何を登録しているのですか? – jjj

+0

*コード*が必要です。コンストラクタに物事を注入するだけでは、特に20秒余分ではありませんが、重要な処理時間を追加することはありません。しかし、処理時間を増やす*他の何かをやっている可能性は十分にあります。残念ながら、コードなしで誰が知っていますか? –

答えて

0

コンストラクタのいくつか(すべて?)は、単に注入されたコンポーネントをプライベートフィールドに割り当てるだけではありません。

また、20のリポジトリが注入されました。 typed factory facilityの使用を検討しましたので、リポジトリファクトリのみを注入し、必要に応じて個々のリポジトリを解決しますか?

public class MyService : IMyService 
{ 
    publiv coid MyService(IRepositoryFactory repoFactory) 
    { 
     _repoFactory = repoFactory; 
    } 

    public void SomeMethod(string id) 
    { 
     var imageRepository = _repoFactory.Get<IImageRepository>(); //or IRepository<Image>() - depends on how your repos are structured 
     var image = imageRepository.Get(id); 
    } 
} 

何らかの方法で統一できれば、サービスと同じことが言えます。

関連する問題