使用IIS Express / Visual Studio进行SimpleInjector验证过程

时间:2013-04-11 20:56:23

标签: c# dependency-injection ioc-container simple-injector

我的解决方案中内置了一个专有事件模型,该模型具有订阅实例化过程,该过程使用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秒钟。

1 个答案:

答案 0 :(得分:1)

如果没有调用Verify(),Simple Injector容器将在第一次请求代理期间回退到一种“及时”的代理编译。在这种情况下,容器通常会构建一个委托来创建整个对象图(即'root'对象及其所有直接和间接依赖关系)。由于委托是为整个对象图构建的,因此通常只编译一个委托。

将其与调用Container.Verify()方法进行比较。调用时,此方法将遍历所有注册并请求每个注册的实例。这会强制为容器中的每个注册编译一个委托(不仅仅是针对直接请求的根类型)。

换句话说,调用Verify会产生很多开销,而且所有这些生成和编译都是在应用程序的启动阶段完成的,而不是像你那样的即时行为。否则得到。

在启动期间调用Verify()并不适合每个应用程序。 Verify()完成所需的时间取决于很多因素,例如:

  • 机器的力量。
  • 您是否在调试器内部运行。
  • 容器中的注册数量。
  • 使用特殊功能。您已经注意到应用装饰器会对编译过程产生影响。当装饰器包含泛型类型约束时,这尤其适用。

在启动期间始终致电Verify(),直到......

直到配置太大而无法调用Verify()。在这种情况下,您可以执行以下操作:

  1. 在连接调试器时阻止调用Verify,因为这里的开销最大。
  2. 如果启动应用程序需要很长时间,请阻止在生产启动期间调用Verify
  3. 创建一个单元测试,调用引导程序代码来请求已配置的容器实例,并让单元测试它上面的Verify()。这可确保在将软件滚动到测试,验收或生产之前很长时间内仍然会发现配置错误。 A verifiable configuration非常重要。