Если объект необходим и не предоставляет значения без него, принудительно установите интерфейс внутри объекта через Конструктор Инъекция ; не проталкивайте конкретный тип через инъекцию, всегда используйте интерфейс.
Поскольку вы не используете контейнер IoC, такой как Unity , вам нужно будет создать свой экземпляр singleton при запуске приложения, а затем убедиться, что данный экземпляр передается через предоставляется конструктор ViewModels по мере необходимости.
Лучшим подходом было бы подтолкнуть экземпляр синглтона к сервису, который может обеспечить необходимое поведение, а затем игнорировать добавление синглтона в модель. Это будет более пуристический подход MVVM и разделит проблемы между вашими Моделями / ViewModels.
РЕДАКТИРОВАТЬ:
Если вы используете Unity, вы определите Lifetime Manager во время регистрации.
// Register a type to have a singleton lifetime without mapping the type
// Uses the container only to implement singleton behavior
myContainer.RegisterType<MySingletonObject>(new ContainerControlledLifetimeManager());
// Following code will return a singleton instance of MySingletonObject
// Container will take over lifetime management of the object
myContainer.Resolve<MySingletonObject>();
Как только вы сделаете это, любая попытка разрешить MySingletonObject
через IUnityContainer
приведет к тому же экземпляру, обеспечивающему одноэлементное поведение, которое вы так желаете во всем приложении. Самим ViewModels не нужно возвращать один и тот же экземпляр. Необходимые данные должны быть извлечены с помощью службы, на которую ссылались ранее, которая потенциально может вести себя как одноэлементная и предоставлять реализацию с сохранением состояния, если это необходимо, но ViewModel не должна быть одиночной. Если вы обнаружите, что делаете Model или ViewModel синглтоном; сделайте шаг назад и проанализируйте свой дизайн.