Время жизни статического класса в веб-контексте - PullRequest
2 голосов
/ 22 марта 2012

Я создаю программное обеспечение для домашних животных, описание которого: "оболочка в Интернете".Я сделаю оболочку для взаимодействия с API, главным образом, для того, чтобы объединить все задачи, которые вы часто делаете в Интернете.

Мне нужна помощь в разработке этого программного обеспечения в .NET 4 (C #).

Я в начале, и Программное обеспечение было разделено на 3 DLL: UI -> Connector -> Commands [] .(Не 3 библиотеки DLL, потому что каждая команда находится в отдельной библиотеке DLL)

Пользовательский интерфейс выполняет команду, которая была в другом .dll, используя Соединитель Проект, который имеет интерфейс, который Команда Реализация проекта.Используя отражение (в UI ), я выполняю реализацию этого интерфейса, поэтому все команды независимы и отделены от основного проекта.

В этом Connector проекциятип с именем Shell , который является посредником для отправки вывода в UI .Поэтому, когда кто-то создает Команду , он будет отправлять тексты или другие вещи, например, используя System.Console .Net Framework.

Я действительно хочу сохранить эту ОБОЛОЧКУкласс статический, но этот класс имеет состояние, и каждый запрос должен иметь независимое состояние.Итак, насколько мне известно, статический класс будет иметь время жизни для пула приложений.Я прав?

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Рассматривали ли вы использование Inversion of Control (IoC) фреймворка. Большинство фреймворков имеют концепцию образа жизни, примеры которой могут быть временными, удаляться после выпадения из области видимости или синглтоном, когда когда-либо создается только один экземпляр.

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

Также статический класс усложняет юнит-тестирование.

IoC примечания:

1 голос
/ 22 марта 2012

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

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

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

Пока «продолжительность жизни» вашего статического класса в веб-приложениион выдержит несколько запросов, но помните, что основной поток веб-сервера будет время от времени перезагружаться автоматически (в зависимости от конфигурации IIS), так что вы не можете доверять статическим членам для сохранения данных «навсегда».Вам следует настроить статические данные на событие запуска приложения и сохранить измененные данные в хранилище permamnet (обычно в базе данных), чтобы гарантировать их восстановление после перезапуска приложения.

Так что вам лучшеизменить дизайн вашего класса.Это не должно предполагать внесения множества изменений в ваше консольное приложение (кроме использования нескольких новых).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...