如何在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没有加载。我做错了什么?

如何在MEF中共享变量

给每个插件一个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

好运