【问题标题】:Getting ALL instances which implement a specific interface with spring.net使用 spring.net 获取实现特定接口的所有实例
【发布时间】:2011-10-24 12:46:25
【问题描述】:

我正在评估不同的 IoC 容器并进行了一些性能测试。在我看来,Spring.NET 在解析由多个类实现的接口时确实很糟糕。

例如给定XmlObjectFactory 类型的container,我调用

foreach (IDummy dummy in container.GetObjectsOfType(interfaceType).Values) {
    dummy.Do();
}

但是,它比我尝试过的任何其他 IoC 框架(即 )花费的时间长 200 倍。

性能真的那么差,还是我做错了™?

【问题讨论】:

  • 这种情况下可能没有缓存,但你多久会做一次这样的事情?拥有数百个定义可能会让人有些头疼,但这是一个真正的问题场景吗?
  • @Thomas:您是否在任何地方发布您的测试结果?读起来会很有趣。
  • @Marijn 你可以在github.com/thoemmi/di_speed 看到代码,它是我从github.com/philipmat/di_speed 派生的。也许有一天我会在博客上写下我的发现;)

标签: autofac castle-windsor lightcore ninject structuremap unity .net inversion-of-control spring.net


【解决方案1】:

common service locator project,Spring.Net 团队为此提供了一个实现。他们对IServiceLocator.GetAllInstances<TService>(); 的实现(类似于您所追求的功能,IMO)使用:

/// <summary>
/// Resolves service instances by type.
/// </summary>
/// <param name="serviceType">Type of service requested.</param>
/// <returns>
/// Sequence of service instance objects matching the <paramref name="serviceType"/>.
/// </returns>
protected override IEnumerable<object> DoGetAllInstances(Type serviceType)
{
    foreach( object o in _factory.GetObjectsOfType(serviceType).Values)
    {
        yield return o;
    }
}

在这个 sn-p 中,GetObjectsOfType(...) 与您使用的接口方法完全相同;尽管可能由您使用的另一个具体实现提供。

因此,根据这个背景和您提供的信息,我得出结论,您没有“做错了”,其中“它”是指使用 GetObjectsOfType(...) 方法在你使用的 spring 上下文中。

您认为您做错了或 Spring 容器执行“真的那么慢”的假设并不是真正相互排斥的 IMO。性能可能会受到许多其他因素的影响,例如您的上下文的确切配置(例如,我们是在处理单例还是原型,单例是否延迟初始化,...)以及基准测试的设置。

如果您仍然认为这种情况下可以提高性能,我相信 Spring 家伙 would like to hear from you :-)。

【讨论】:

    【解决方案2】:

    更好的选择是使用简单的 LINQ 查询,如下所示:

    var list = appCtx.GetObjectsOfType(typeof(ISomeType)).Values
        .OfType<ISomeType>().ToList();
    

    【讨论】:

      猜你喜欢
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2010-09-06
      相关资源
      最近更新 更多