为什么Container.Configure需要这么长时间?

时间:2016-09-18 14:53:40

标签: c# dependency-injection structuremap

今天我正在调查我们系统的缓慢程度。通过插入一些调试日志,我将其缩小到这一部分:

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使用此实例进行依赖注入。

在日志中,每条线之间的时间间隔可以忽略不计,除了&#34; Anon 2&#34;和&#34;点2&#34;,它可以占据一秒的区域。不好。但我从来没有见过StructureMap花了这么长时间来配置用法。

我在这里做错了吗?

1 个答案:

答案 0 :(得分:0)

正如来自StructureMap的好朋友在GitHub页面上所回答:

  

@CoreyKaylor说:配置调用不应该在运行时发生,只有启动,所以如果每个Web请求发生此调用作为一个例子,它将非常慢,因为配置调用需要全局锁定。如果绝对需要运行时覆盖,则更好的替代方法是使用嵌套容器作为http请求的范围,并将TypeArguments传递给嵌套容器。这就是假设你也在运行最新版本的StructureMap。

在我的情况下,这转换为:

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