Я работаю над приложением WPF, используя шаблон MVVM.
Каждому ViewModel потребуется доступ к объекту безопасности, который, по сути, предоставляет информацию о правах, которыми обладает пользователь. Поскольку этот объект необходимо заполнить только один раз при запуске, а заполнение его (по крайней мере, потенциально) дорого, я хочу сохранить его в состоянии в течение всего срока службы приложения.
Я могу сделать это статической переменной в приложении, что сделало бы ее доступной для всего приложения (по крайней мере, это мое понимание). Это сделает мои реализации ViewModel очень сложными для тестирования, так как вызов App.SecurityObject будет встроен в каждую ViewModel. Мне нужно убедиться, что приложение доступно для каждого теста, и высмеивать вызов App.SecurityObject (на самом деле я даже не уверен, что это сработает).
Мы используем StructureMap, поэтому я мог бы создать SecurityObjectProvider и настроить его с жизненным циклом Singleton в контейнере, и просто сделать его частью каждого конструктора ViewModel. Недостатком будет то, что (как я уже сказал) поставщик должен быть частью каждого конструктора модели представления.
Есть и другие хакерские обходные пути, о которых я могу подумать, но они будут включать создание методов (возможно, в базовом классе View Model), которые позволят внедрить объект безопасности после создания экземпляра только для целей тестирования. Я обычно стараюсь избегать такого рода кода «только для тестирования».
Похоже, что это будет распространенной проблемой, но я не могу найти какие-либо SO вопросы, которые полностью уместны.