我的解决方案中内置了一个专有事件模型,该模型具有订阅实例化过程,该过程使用SimpleInjector的GetAllInstances()
方法来定位事件的所有订阅者
public IEnumerable<ISubscriber<T>> GetSubscriptions<T>()
where T : IEvent
{
return _container.GetAllInstances<ISubscriber<T>>();
}
我的性能会有很大差异,具体取决于我是否注册了ISubscriber
的所有实例
这是我用来注册ISubscriber
internal void Configure(Container container)
{
container.RegisterManyForOpenGeneric(
typeof(ISubscriber<>),
AccessibilityOption.PublicTypesOnly,
(serviceType, implTypes) =>
container.RegisterAll(serviceType, implTypes),
AppDomain.CurrentDomain.GetAssemblies()
);
container.RegisterDecorator(typeof(ISubscriber<>),
typeof(SubscriberTraceDecorator<>));
container.RegisterDecorator(typeof(ISubscriber<>),
typeof(SubscriberExceptionDecorator<>));
}
当我在没有调用RegisterManyForOpenGeneric
的情况下引导容器时,容器验证大约需要11秒并返回结果:
配置警告:未检测到警告。
注册:计数= 158
但是,当我取消注释RegisterManyForOpenGeneric
时,容器验证大约需要72秒并返回结果:
配置警告:已检测到136个已由181个组件引用的容器注册类型
注册:Count = 475
我的问题是 - 这样可以,还是我在这里做错了什么?我一直在添加更多ISubscriber
个类,而现在(启动)太慢了......
更新
对于在Visual Studio 中运行的WebAPI项目来说,这似乎只是一个问题。从控制台应用程序引导需要在Visual Studio中运行15秒。将WebAPI项目部署到IIS后,验证需要6秒钟。
答案 0 :(得分:1)
如果没有调用Verify()
,Simple Injector容器将在第一次请求代理期间回退到一种“及时”的代理编译。在这种情况下,容器通常会构建一个委托来创建整个对象图(即'root'对象及其所有直接和间接依赖关系)。由于委托是为整个对象图构建的,因此通常只编译一个委托。
将其与调用Container.Verify()
方法进行比较。调用时,此方法将遍历所有注册并请求每个注册的实例。这会强制为容器中的每个注册编译一个委托(不仅仅是针对直接请求的根类型)。
换句话说,调用Verify
会产生很多开销,而且所有这些生成和编译都是在应用程序的启动阶段完成的,而不是像你那样的即时行为。否则得到。
在启动期间调用Verify()
并不适合每个应用程序。 Verify()
完成所需的时间取决于很多因素,例如:
在启动期间始终致电Verify()
,直到......
直到配置太大而无法调用Verify()
。在这种情况下,您可以执行以下操作:
Verify
,因为这里的开销最大。Verify
。Verify()
。这可确保在将软件滚动到测试,验收或生产之前很长时间内仍然会发现配置错误。 A verifiable configuration非常重要。