Получение ВСЕХ экземпляров, которые реализуют определенный интерфейс с spring.net - PullRequest
1 голос
/ 11 августа 2011

Я оцениваю различные контейнеры IoC и провел тестирование производительности.Мне кажется, что Spring.NET действительно плох, когда дело доходит до разрешения интерфейсов, которые реализуются несколькими классами.

Например, учитывая container типа XmlObjectFactory, я называю

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

Однако, это занимает в 200 раз больше времени, чем любые другие фреймворки IoC, которые я пробовал, а именно: , , , , и .

Действительно ли производительность настолько плоха, или я делаю это неправильно ™?

Ответы [ 2 ]

1 голос
/ 25 декабря 2014

Лучшим вариантом является использование простого запроса LINQ, например:

var list = appCtx.GetObjectsOfType(typeof(ISomeType)).Values
    .OfType<ISomeType>().ToList();
1 голос
/ 17 августа 2011

Существует общий проект поиска служб , для которого команда 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;
    }
}

В этом фрагменте GetObjectsOfType(...) точно такой же метод интерфейса, как и тот, который вы используете; хотя, возможно, обеспечивается другой конкретной реализацией, чем та, которую вы используете.

Итак, исходя из этого фона и предоставленной вами информации, я заключаю, что вы не «делаете это неправильно» , где «это» относится к использованию метода GetObjectsOfType(...) для контекст весны, который вы используете.

Ваши предположения о том, что вы либо делаете это неправильно, либо контейнер Spring выполняет "очень медленно", на самом деле не являются взаимоисключающими IMO. На производительность могут повлиять многие другие факторы, например, точная конфигурация вашего контекста (например, имеем ли мы дело с синглетонами или прототипами, синглтоны с ленивой инициализацией, ...) и настройка вашего теста производительности.

Если вы все же решите, что производительность может быть улучшена для этого сценария, я уверен, что ребята из Spring хотели бы услышать от вас : -).

...