2012-04-02 33 views
0

我有一個主目錄,在一個目錄中加載很多插件(dll文件)。我想與所有插件分享一個變量,即Kinect聲明。我想這樣做,因爲,大師班使用Kinect,但我也需要它在我的插件中,不能多次聲明它。如何在MEF中共享一個變量

這樣做的最佳方法是什麼?

謝謝。

編輯:所以我這樣做:

[ImportingConstructor] 
     public MainWindow([Import("myKinect")] KinectSensor myKinect) 
     { 
      _kinectSensor = myKinect; 
     } 

     public MainWindow() 
     { 
      InitializeComponent(); 
      StartShowVideo(); 
     } 

而且在我的容器:

CompositionContainer container = new CompositionContainer(containerMaster); 
      container.ComposeExportedValue("myKinect",_myKinect); 
      container.ComposeParts(this); 

但它不能正常工作,用戶界面沒有加載。我究竟做錯了什麼?

+2

爲什麼你不能使用構造函數注入? – BrokenGlass 2012-04-02 13:12:07

+0

我不知道它是什麼。 – 2012-04-02 14:17:54

回答

2

給每個插件提供Kinect可能不是一個好主意。通過這樣做,您將強制每個插件瞭解Kinect API(或您的包裝器)。更糟糕的是,每個插件都有可能將Kinect傳感器的狀態更改爲適用於插件,但由於沒有兩個插件應該彼此瞭解任何內容,因此更改了Kinect傳感器的狀態像kinect傳感器這樣的共享資源可以讓每個其他插件都能夠完美工作。更不用說你需要添加一個機制來通知Kinect傳感器狀態已經改變的插件。我希望你開始看到這種方法所帶來的麻煩。

而不是給每個插件提供Kinect的參考,我會推薦做相反的事情。也就是說,爲每個想要使用Kienct傳感器的插件提供集中的Kinect插件訪問權限。更具體地說,您可以創建一個kinect插件類,該類是[ImportMany]是IKinectClient類的集合。然後,無論何時視頻幀準備就緒,或識別出語音術語或發生任何其他事情,Kinect插件都可以在每個感興趣(已註冊)的IKinectClient插件上觸發代理,以通知該事件。這樣,您就可以爲實際的Kinect代碼維護一個集中的地方,並且您需要對應用程序如何與Kinect SDK進行交互的更改集中在一個類中。這是控制反轉的力量!

注意:我給IKinectClient作爲您的kinect相關接口可能支持的接口的示例名稱。實際上,你可能不希望所有的kinect interations都有一個大的界面。相反,你會想要分割你的itnefaces。例如IKinectSpeechClient,IKinectVideoClient,IKinectGestureClient等。

有了這個方法,客戶端的kinect插件不需要知道關於Kinect本身的任何信息,也不需要知道關於Kinect API的任何信息(給出Kinect for Windows SDK的出現速度,這是一個主要的優點)。

我已經在這個問題上合作過,並在這裏的博客上講述它:

http://beachfrontcoding.tumblr.com/post/7339567531/kinectaudiopluginforsoapboxcore

好運

+0

感謝您提供的信息,您的想法非常棒。但首先,我堅持我的方式來做到這一點。 我解決了我的問題,它是不允許的兩個構造函數,我只將一切都放入了一個,它的工作。 再一次,感謝您的想法,我很快就會這樣做。 – 2012-04-03 09:13:59