Я работаю над веб-приложением, которое использует несколько сервисов для синхронизации данных с внешними ресурсами. Приложение и службы используют один и тот же уровень данных и используют Castle Windsor для реализации IoC.
В веб-приложении существует стиль жизни PerWebRequest, который ограничивает время существования экземпляра временем существования запроса. Я хочу использовать нечто подобное в сервисах.
Службы запускаются время от времени для выполнения синхронизации. Я хочу, чтобы службы и репозитории в слое данных были единичными в одной итерации службы, аналогично образу жизни PerWebRequest в веб-приложении.
Я придумал концепцию Run . Прогон - это одиночный вызов кода синхронизации внутри службы. Это выглядит так:
using( _runManager.Run() )
{
var sync = _usageRepoFactory.CreateInstance();
sync.SynchronizeUsage();
}
Реализация IRun
освободит все экземпляры с разрешенным PerRunLifeStyle с момента его создания, когда он будет расположен, в конце блока using
.
Этот код выглядит довольно чистым, но мне интересно, есть ли лучший способ сделать это. Я пытался использовать дочерние контейнеры, но после профилирования решения они оказались довольно «тяжелыми»
Любые отзывы приветствуются. При необходимости я также могу опубликовать реализацию IRun
.
Обновление
Основываясь на комментариях, я немного очистил код. Я ввел новый сервис IRunManager
, который в основном является фабрикой для IRun
. Я также начал использовать фабрику, чтобы избавиться от вызова ServiceLocator.