Лучшие практики LinFu IoC на сайтах с высоким трафиком - PullRequest
2 голосов
/ 15 марта 2011

Мы находимся на последних этапах создания веб-сайта с довольно высоким трафиком (около 6 миллионов показов страниц в неделю) и используем LinFu в качестве контейнера IoC в новой архитектуре.

У нас довольно стандартная настройка:

Web Layer
 |
IServices <- Services Implementation
 |
IDataRepository <- DataRepository Implementation
 |
DataBase

На веб-уровне у нас есть экземпляр LinFu ServiceContainer (единичный элемент в нашей реализации), который предоставляет экземпляры объектов Services в соответствии с требованиями страниц. Каждый из классов в сборке DataRepository также создается одним и тем же способом (каждый конструктор Services принимает необходимые ему интерфейсы объектов DataRepository).

Быстрый пример:

IWeatherServices
{
    Weather GetForecast();
    Weather GetPrediction();
}

[Implements(typeof(IWeatherServices))
WeatherServices(IWeatherForecastRepository, IWeatherPredictionRepository) : IWeatherServices
{
    // implementation of methods
}

(и аналогичные функции снова для классов DataRepository)

В настоящее время мы оставили тип жизненного цикла по умолчанию (я считаю, что это PerRequest).

Мои основные вопросы:

  • Должны ли мы хранить ServiceContainer как единое целое в веб-приложении?
  • Должен ли LifecycleType для реализующих классов оставаться значениями по умолчанию?

Я знаю, что это немного открытый процесс, но мы находимся в процессе настройки во время нагрузочного тестирования, поэтому меня очень интересует общее мнение.

Ответы [ 2 ]

3 голосов
/ 13 апреля 2011

Если вы не используете функции автоматической вставки полей / свойств / методов LinFu, попробуйте:

container.DisableAutoPropertyInjection();
container.DisableAutoMethodInjection();
container.DisableAutoFieldInjection();

Это должно значительно повысить производительность контейнера LinFu, так как ему не придется постоянно проверять ваши поля, свойства и методы для автоматической инъекции.

1 голос
/ 15 марта 2011

Наличие одного экземпляра контейнера (то есть синглтона) - очень распространенная вещь. Тем не менее, не допускайте его вызова во всем приложении. Вместо этого используйте инъекцию конструктора и пусть контейнер разрешает только самые верхние объекты. Глядя на ваш пример, я полагаю, что вы уже делаете это.

Переходный образ жизни (создание нового экземпляра при каждом обращении к контейнеру) - это самая простая и часто самая безопасная вещь. Изменения в условиях гонки из-за многопоточности минимальны. С другой стороны, это худший образ жизни.

Стоит ли менять образ жизни? Если ваше приложение достаточно быстрое, мне не стоит беспокоиться. И если это не достаточно быстро, вы должны выяснить, оказывает ли какое-либо влияние перемещение услуг на единый образ жизни. Другими словами, следуйте 10 правилам Rico Mariani для исполнения: измерять, измерять, измерять, измерять, измерять, измерять, измерять, измерять, измерять и измерять: -)

...