Castle Project - Параметры для обновления синглтона Castle Windsor (истекает? Notify?) - PullRequest
2 голосов
/ 19 ноября 2010

Я использую Castle Windsor 2.0 для внедрения зависимостей в моем проекте ASP.NET MVC 2.

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

<component id="Configuration" service="MyInterface, 
    MyAssembly" type="MyClass, MyAssembly2" lifestyle="Singleton" />

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

Возможные решения:

  1. Сокращение времени жизни пула приложений
  2. Попросите администраторов сайта перезапустить пул приложений, если они хотят немедленного изменения
  3. Переключиться на другой контейнер DI
  4. Использовать один веб-сайт для всего
  5. Изменить синглтон на PerWebRequest
  6. Создание механизма, позволяющего интерфейсу администратора уведомлять приложение и обновлять синглтон.
  7. Устанавливать срок действия синглтона по истечении заданного времени, что приводит к необходимости обновления

IЯ думаю, что вариант 7 (однократное истечение срока действия) будет идеальным, но после просмотра документации Castle может показаться, что функция истечения еще не доступна. пользовательский образ жизни кажется возможным решением, но я не вижу, как я мог бы это реализовать.

У кого-нибудь есть какие-либо предложения о том, как реализовать варианты 6 или 7?Может быть, есть другое решение?

Ответы [ 5 ]

4 голосов
/ 20 ноября 2010

Вы можете просто вызвать метод на синглтоне, чтобы перезагрузить настройки всякий раз, когда что-то меняется. Или есть таймер, встроенный в синглтон, который обновляет его.

1 голос
/ 28 ноября 2013

Аналогично @Mark 909, но вместо FileSystemWatcher (для которого нужен файл) я бы использовал System.Threading.Mutex.

Веб-проект (с Singleton)

Я бы расширил синглтон мьютексом ( см. Этот вопрос, чтобы правильно реализовать мьютекс ).При инициализации Singleton я бы создал новый поток (используя ThreadPool или Task API ), который блокирует вызов метода WaitOne().Когда Mutex получит сигнал, поток продолжится, и вы сможете перезагрузить конфигурацию.Не забудьте разблокировать Mutex, позвонив по номеру ReleaseMutex().

Административный сайт

Добавляйте ссылку на Mutex в это приложение и всякий раз, когда вносятся изменения, которые должны привести кперезагрузите данные конфигурации, отпустите Mutex с ReleaseMutex().Это приведет к тому, что веб-проект (т. Е. Singleton) получит сигнал и выполнит перезагрузку.Не забудьте взять Mutex, используя WaitOne().Так как это функция блокировки и это веб-сайт, вы можете рассмотреть WaitOne(TimeSpan).Используя небольшой интервал времени, вы можете сообщить пользователям административного сайта, что веб-проект все еще занят загрузкой конфигурации.

1 голос
/ 19 ноября 2010

Можете ли вы создать зависимость от файла - например, web.config, но что-то еще - который сообщает синглтону о необходимости перезагрузить себя при изменении файла?

Я делаю нечто подобное с AutoFac для DI, но вВ моем случае я работаю с репозиториями в памяти для некоторых небольших коллекций часто используемых объектов, которые редко меняются.Когда они ДЕЙСТВИТЕЛЬНО изменяются через веб-сайт maintennace, я прикасаюсь к файлу, который вынуждает извлечь запись в кеше, которая истекает все кэшированные элементы, вызывая перезагрузку.

Не уверен, что это значит в Castle, поскольку мое решение не 'Это действительно связано с Autofac.Но, может быть, вместо единственного в замке ваш объект конфигурации может находиться в кэше asp.net и срок его действия истекает так же?Castle возвращает объект, который загружает данные в синглтон и при необходимости кэширует его (с зависимостью от файла).

0 голосов
/ 31 декабря 2010

Я хотел бы поделиться тем, что в Ninject есть метод повторного связывания, который отлично сработал для этого сценария. Переход от Касла к Нинъекту был относительно безболезненным.

void MvcApplication_BeginRequest(object sender, EventArgs e)
{
  if (/* criteria to refresh singleton */)
    this.Kernel.Rebind<IMySingleton>().To<MySingleton>().InSingletonScope();
}
0 голосов
/ 25 ноября 2010

Я реализовал нечто подобное, используя Singleton in Castle. Мой синглтон использует FileSystemWatcher для отслеживания событий изменений и затем перезагружает данные в объект словаря в синглтоне при изменении файла. Этот файл содержит довольно статические справочные данные

Конечно, вам придется решать проблемы параллелизма при перезагрузке данных в Singleton.

...