2016-09-18 1 views
0

今日私は私たちのシステムの遅さを調べていました。いくつかのデバッグログを挿入することにより、私は、このセグメントにそれを絞り込む:なぜContainer.Configureが長くかかるのですか?

var db = MyDbContext.ForShard(shardKey); 
_logger.Debug("Point 1"); 
container.Configure(cfg => 
        { 
         _logger.Debug("Anon 1"); 
         cfg.For<MyDbContext>().Use(db); 
         _logger.Debug("Anon 2"); 
        }); 
_logger.Debug("Point 2"); 

データベースがかけらであり、断片は、使用するshardKey識別する。 MyDbContext.ForShard()を呼び出すと、接続文字列が正しいシャードを参照するデータベース接続が返されます。問題のスニペットは、StructureMap Containerに、このインスタンスを依存性注入に使用するように指示します。

ログでは、「Anon 2」と「Point 2」の間のギャップを除いて、各行のタイムラグは無視されます。良くない。しかし、私は、StructureMapが使い方を構成するのにずっと時間がかかることは決して見たことがありません。

ここで何か問題がありますか?そのGitHubページのStructureMapから素敵な人々によって答えたよう

+0

。大きなアプリケーションでは、何秒も例外ではありません。なぜこの1秒の遅延が問題なのですか? – Steven

答えて

0

@CoreyKaylorは言う:のconfigureコールのみ起動、実行時に起こるべきではありません。この呼び出しは、すべてのWeb要求などのために何が起こっているかのように、 configureコールがグローバルロックを必要とするため、非常に遅い例です。実行時のオーバーライドが絶対に必要な場合は、HTTP要求のスコープにネストされたコンテナを使用し、TypeArgumentsをネストされたコンテナに渡すことをお勧めします。それはあなたがStructure Mapの最新バージョンを実行していることを前提としています。私の場合は

これはに変換:コンテナテイク時間を設定する

var db = MyDbContext.ForShard(shardKey); 
var typeArgs = new TypeArguments(); 
typeArgs[typeof(MyDbContext)] = db; 
var nested = container.GetNestedContainer(typeArgs); 
関連する問題