2016-05-04 2 views
0

У меня возникла проблема, и я только недавно определил следующее как причину (до сих пор было устранение симптомов). В основном, у меня есть решение, в котором есть проект приложения WPF (запуск), куча сборок (Model, ModelView и т. Д.) И надстройка Word VSTO. ViewModel и надстройка Word составляют одну из моделей, которые для этой стадии разработки я создал Singleton.C# Singleton, подвергшийся воздействию MS Word Interop Надстройка

модели представления конкретизирует модель в своем конструкторе, используя

ModelSingleton mod = ModelSingleton.Instance; 

метод надстройка делает то же самое на ThisAddIn_Startup().

код модели:

private static volatile ModelSingleton instance; 
private static object syncRoot = new Object(); 

private ModelSingleton() 
{ 
} 

public static ModelSingleton Instance 
{ 
    get 
    { 
     lock (syncRoot) 
     { 
      if (instance == null) 
      { 
       instance = new ModelSingleton(); 
      } 
     } 
     return instance; 
    } 
} 

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

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

Я новичок в Interop и COM; Я ожидал бы, что синглтон будет создан только один раз. Существуют ли две отдельные среды выполнения или что-то происходит здесь (видимо, VSTO и WPF являются исполняемыми файлами, что означает, что они не могут напрямую обмениваться данными)? Как сделать Singleton истинным Singleton? И если это невозможно, как бы вы передали выделенный текст (и метаданные) из MS Word в свое проприетарное приложение?

ответ

0

Я думаю, что вы пытаетесь сделать это:

public static ModelSingleton Instance 
{ 
    private static ModelSingleton instance = null; 
    private static readonly object syncRoot = new Object(); 

    private ModelSingleton() 
    { 
    } 
    get 
    { 
     lock (syncRoot) 
     { 
      if (instance == null) 
      { 
       instance = new ModelSingleton(); 
      } 
     } 
    return instance; 
    } 
} 

это даст вам безопасность потока без тупиков

+1

Извините, если это было неясно, но представьте себе, «общественный класс ModelSingleton { }» завернутые вокруг кода выше – Moe45673

 Смежные вопросы

  • Нет связанных вопросов^_^