Как поделиться переменной в MEF - PullRequest
0 голосов
/ 02 апреля 2012

У меня есть мастер-проект, который загружает много плагинов (DLL-файлов) в каталог.Я хотел бы поделиться переменной, которая является объявлением Kinect, со всеми плагинами.Я хочу сделать это, потому что мастер-класс использует 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);

Но это не работаетпользовательский интерфейс не загружен.Что я делаю не так?

1 Ответ

2 голосов
/ 02 апреля 2012

Предоставление каждому плагину ссылки на Kinect может быть не очень хорошей идеей. Таким образом вы заставите каждый плагин знать API Kinect (или вашу оболочку). Хуже того, каждый плагин потенциально может изменить состояние датчика Kinect на что-то, что подходит для этого плагина, но поскольку никакие два плагина не должны ничего знать друг о друге, изменяя состояние общего ресурса, такого как датчик kinect, может быть винт любого другого плагина. Не говоря уже о том, что вам нужно будет добавить механизм уведомления плагинов об изменении состояния датчика Kinect. Я надеюсь, что вы начинаете видеть головные боли, связанные с этим подходом.

Вместо того, чтобы давать каждому плагину ссылку на Kinect, я бы рекомендовал сделать противоположное. А именно, предоставить централизованный плагин Kinect доступ к каждому плагину, который хочет использовать датчик Kienct. Более конкретно, вы можете создать класс подключаемого модуля kinect, который [ImportMany] представляет собой набор классов IKinectClient. Затем всякий раз, когда видеокадр готов, или распознается речевой термин, или что-то еще происходит, плагин Kinect может запускать делегата в каждом плагине IKinectClient, который заинтересован (зарегистрирован), чтобы получить уведомление об этом событии. Таким образом, вы сохраняете централизованное место для своего действительного кода Kinect, и любые изменения, которые необходимо внести в то, как ваше приложение взаимодействует с датчиком Kinect и / или Kinect SDK, централизованы в одном классе. Это сила Инверсии Контроля!

ПРИМЕЧАНИЕ. В качестве примера я дал IKinectClient для интерфейса, который могут поддерживать ваши интерфейсы, связанные с kinect. В действительности вы, вероятно, не захотите использовать один большой интерфейс для всех взаимодействий Kinect. Вместо этого вы захотите отделить свои внутренние поверхности. например IKinectSpeechClient, IKinectVideoClient, IKinectGestureClient, т. Д.

С этим appraoch, клиентские плагины Kinect не должны ничего знать о самом Kinect, и при этом им не нужно ничего знать о Kinect API (укажите скорость, с которой выходят Kinect для Windows SDK, это главный плюс).

Я уже работал над этой проблемой и писал об этом здесь:

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

Удачи

...