2012-04-02 34 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