2013-10-01 97 views
2

我有一個Visual Studio擴展,其中很多功能都是通過MEF編寫的。到目前爲止,我的個人功能是每ITextBuffer,所以我使用了屬性成員來緩存實例。Visual Studio擴展中的靜態數據

但是,現在我有一些功能需要每個項目和每個解決方案。 EnvDTE類提供了一個Properties對象,但我無法弄清楚他們是否可以存儲我自己的任意數據。我真的不想讓自己的數據是靜態的。

如何存儲每個項目和每個解決方案的數據而不必求助於全局變量?

編輯:

我可能還提到,因爲你不能使用靜態數據MEF進口,即使你把它藏在像一個Singleton,然後使用全局變量的路線是不可能的。所以我真的需要一些不是全球性的東西。

編輯:

我說的是對象引用,而不是持久值。我不需要在解決方案或項目文件中存儲任何內容,只能使用該對象。

+0

你能舉一些例子/截圖嗎?我對MEF不是很熟悉,這可能就是爲什麼你的問題看起來不清楚。 – Neolisk

+0

@Neilisk:你想要什麼屏幕截圖,MEF的文檔說你不能導入靜態成員?或者沒有用戶可用存儲空間的EnvDTE.Solution/EnvDTE.Project的文檔? – Puppy

+0

沒有冒犯,我只是試圖增加這個問題被回答的機會,如果不是我,別人會。你提供的信息越多越好。你不想把你的賞金無用,對吧?是的,鏈接到文檔的相關部分將有所幫助。 – Neolisk

回答

0

我發現了一種說服MEF來尊重我的靜態導入的方法,所以現在我只使用一些靜態數據。

(Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SComponentModel)) as IComponentModel).DefaultCompositionService.SatisfyImportsOnce(this); 

它被張貼在其他地方 - 也許甚至在SO-上花了我一段時間找到它。請注意,this沒有所需的接口 - 使用反射,所以它應該對任何this有效。

+0

你是怎麼做到的? –

0

如果我正確理解您的問題,您可以創建一個存根類,您可以從中導出,而不是試圖強制導出您的靜態類。

public class HostClass 
{ 
    public static string StaticString 
    { get { return "string value"; } } 
} 

public class HostClassStub 
{ 
    [Export("StaticStringValue", typeof(string))] 
    public string StaticString 
    { get { return HostClass.StaticString; } } 
} 

你也可以考慮讓你的靜態類變成靜態的,如果這是你的選擇。請記住,默認情況下MEF導入是單例,因此它應該就像導入每個項目的全局變量集一樣。

我知道這並沒有解決您的問題的VS擴展方面,但我沒有處理這些。不過,這可能會爲您提供解決方案。