2016-09-18 138 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使用此實例進行依賴注入。

在日誌中,每一行之間的時間延遲是可以忽略的,除了「匿名2」和「點2」之間的間隙,這可能需要在第二的區域中。不好。但是我從來沒有見過StructureMap花費這麼久來配置一個用法。

我在這裏做錯了什麼?

+0

建立一個容器需要時間。對於大型應用程序來說,許多秒也不例外。爲什麼延遲1秒是一個問題? – Steven

回答

0

由於他們GitHub頁面上回答了來自StructureMap漂亮的人:

@CoreyKaylor說:配置調用不應該在運行時發生,只在啓動因此,如果這一呼籲正在發生的每一個Web請求作爲一個例子它會非常緩慢,因爲配置調用需要一個全局鎖。一個更好的選擇,如果你確實需要運行時覆蓋是使用嵌套容器的http請求的範圍,並通過TypeArguments到嵌套容器。假設你也運行最新版本的StructureMap。

在我而言這相當於:

var db = MyDbContext.ForShard(shardKey); 
var typeArgs = new TypeArguments(); 
typeArgs[typeof(MyDbContext)] = db; 
var nested = container.GetNestedContainer(typeArgs); 
相關問題