Лучшие практики LinFu IoC на сайтах с высоким трафиком
Мы находимся на завершающей стадии создания веб-сайта с довольно высоким трафиком (около 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 ответа
Наличие одного экземпляра контейнера (то есть синглтона) - очень распространенная вещь. Тем не менее, не допускайте его вызова во всем приложении. Вместо этого используйте инъекцию конструктора и пусть контейнер разрешает только самые верхние объекты. Глядя на ваш пример, я думаю, что вы уже делаете это.
Переходный образ жизни (создание нового экземпляра при каждом обращении к контейнеру) - это самое простое и часто самое безопасное. Изменения в условиях гонки из-за многопоточности минимальны. С другой стороны, это худший образ жизни.
Стоит ли менять образ жизни? Если ваше приложение достаточно быстрое, мне не стоит беспокоиться. И если это не достаточно быстро, вы должны выяснить, оказывает ли какое-либо влияние перемещение услуг на единый образ жизни. Другими словами, следуйте 10 правилам производительности Рико Мариани: измеряйте, измеряйте, измеряйте, измеряйте, измеряйте, измеряйте, измеряйте, измеряйте, измеряйте и измеряйте:-)
Если вы не используете функции автоматической вставки полей / свойств / методов LinFu, попробуйте:
container.DisableAutoPropertyInjection();
container.DisableAutoMethodInjection();
container.DisableAutoFieldInjection();
Это должно значительно повысить производительность контейнера LinFu, так как ему не придется постоянно проверять ваши поля, свойства и методы для автоматической инъекции.