Составной WPF: глобальные переменные?

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

Есть ли наилучшая практика хранения такой информации в приложении Composite WPF? Как я могу передать информацию своим модулям, сохраняя при этом слабые связи? Спасибо за вашу помощь

Дэвид Винеман
Foresight Systems


person David Veeneman    schedule 01.09.2009    source источник


Ответы (3)


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

person Kent Boogaart    schedule 01.09.2009

Создайте интерфейс, в обязанности которого входит возврат "имени выбранного файла". В отличие от большинства сервисов/зависимостей, он не будет много обрабатывать — он просто отвечает за возврат значения. Используйте внедрение зависимостей, чтобы предоставить средство реализации этой службы во все места, где это необходимо.

На данный момент это имя файла может показаться действительно глобальным, но представьте, что ваше приложение должно перейти с SDI на MDI. Никогда не рекомендуется иметь настоящие синглтоны в составных приложениях.

person Rob Fonseca-Ensor    schedule 01.09.2009
comment
Что касается синглтонов и MDI, у вас может быть приложение с одним открытым файлом и интерфейсом MDI. Решения Visual Studio представляют собой один файл в среде MDI. - person Cameron MacFarland; 01.01.2010

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

Я загружаю все модули в свое приложение Composite WPF при запуске и активирую только те представления, которые будут отображаться изначально. Таким образом, все мои модули, даже те, которые не показаны, доступны сразу после завершения запуска.

При инициализации каждый модуль, которому требуется путь к файлу, подпишется на составное событие FileOpened в агрегаторе событий Prism. Когда файл открывается из оболочки, модель представления оболочки публикует составное событие FileOpened. Составное событие будет содержать путь к файлу в качестве полезной нагрузки.

Таким образом, когда событие FileOpened публикуется моделью представления Shell, соответствующий метод обратного вызова в каждом модуле будет вызываться агрегатором событий Prism, а filePath будет передан в модель представления каждого модуля.

person David Veeneman    schedule 01.09.2009