如何在MEF中共享变量
本文关键字:共享变量 MEF | 更新日期: 2023-09-27 18:29:48
我有一个主项目,可以在一个目录中加载许多插件(dll文件)。我想与所有插件共享一个变量,谁是Kinect声明。我想这么做是因为,master类使用Kinect,但我在插件中也需要它,并且不能多次声明它。
最好的方法是什么?
谢谢。
编辑:所以我做了这个:
[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);
但它不起作用,UI没有加载。我做错了什么?
给每个插件一个Kinect的引用可能不是一个好主意。通过这样做,您将强制每个插件都了解Kinect API(或您的包装器)。更糟糕的是,每个插件都有可能将Kinect传感器的状态更改为适用于该插件的状态,但由于没有两个插件应该相互了解,因此更改像Kinect传感器这样的共享资源的状态可能会彻底破坏其他插件。更不用说,您需要添加一种机制来通知插件Kinect传感器状态已更改。我希望你开始看到这种方法所带来的头痛。
与其给每个插件一个Kinect的参考,我建议做这个假设。也就是说,让一个集中的Kinect插件访问每个想要使用Kienct传感器的插件。更具体地说,您可以创建一个kinect插件类[ImportMany],它是IKinectClient类的集合。然后,每当视频帧准备好,或者识别出语音术语,或者发生其他任何事情时,Kinect插件都可以在每个感兴趣(已注册)的IKinectClient插件上激发一名代理,以获得该事件的通知。通过这种方式,您可以为实际的kinect代码维护一个集中的位置,并且您需要对应用程序与kinect传感器和/或kinect SDK的交互方式进行的任何更改都集中在一个类中。这就是控制反转的力量!
注意:我给出了IKinectClient作为kinect相关接口可能支持的接口的示例名称。事实上,你可能不希望所有的运动交互都有一个大的界面。相反,你会想要分割你的脸。例如IKinectSpeechClient、IKinectVideoClient、IKinetGestureClient等。
有了这个appaoch,客户端kinect插件不必了解kinect本身,也不需要了解kinect API(考虑到kinect for Windows SDK的推出速度,这是一个主要优势)。
我以前处理过这个问题,并在这里写过博客:
http://beachfrontcoding.tumblr.com/post/7339567531/kinectaudiopluginforsoapboxcore
好运