今天我正在调查我们系统的缓慢程度。通过插入一些调试日志,我将其缩小到这一部分:
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花了这么长时间来配置用法。
我在这里做错了吗?
答案 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);