2012-04-02 17 views
0

Ich habe ein Masterprojekt, das viele Plugins (DLL-Dateien) in ein Verzeichnis lädt. Ich möchte eine Variable, die die Kinect-Deklaration ist, mit allen Plugins teilen. Ich möchte das machen, weil die Master-Klasse die Kinect benutzt, aber ich brauche sie auch in meinen Plugins und kann sie nicht oft deklarieren.Wie Sie eine Variable in MEF teilen

Was ist der beste Weg, es zu tun?

Danke.

EDIT: Also ich dies tat:

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

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

Und in meinem Behälter:

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

Aber es funktioniert nicht, wird die Benutzeroberfläche nicht geladen. Was mache ich falsch?

+2

warum Sie Injektion verwenden Konstruktor kann nicht wahr? – BrokenGlass

+0

Ich wusste nicht, was es war. –

Antwort

2

Jedem Plug-in einen Verweis auf die Kinect zu geben, ist vielleicht keine gute Idee. Dadurch erzwingen Sie, dass jedes Plug-in Kenntnisse über die Kinect-API (oder Ihren Wrapper davon) hat. Schlimmer noch, jedes Plug-in könnte möglicherweise den Zustand des Kinect-Sensors in etwas ändern, das für das Plug-In funktioniert, aber da keine zwei Plug-Ins etwas voneinander wissen sollten, ändert sich der Zustand eines Gemeinsame Ressource wie ein Kinect-Sensor könnte Schraube jedes andere Plug-in schließen. Ganz zu schweigen davon, dass Sie einen Mechanismus zur Benachrichtigung von Plug-Ins hinzufügen müssen, bei dem sich der Kinect-Sensorstatus geändert hat. Ich hoffe, dass Sie beginnen, die Kopfschmerzen zu sehen, die mit diesem Ansatz verbunden sind.

Anstatt jedem Plug-in einen Verweis auf die Kinect zu geben, würde ich empfehlen, das Gegenteil zu tun. Nennen Sie für jeden Plug-in, der den Kienct-Sensor verwenden möchte, einen zentralen Kinect-Plug-in-Zugriff. Konkreter könnten Sie eine Kinect-Plug-in-Klasse erstellen, die [ImportMany] eine Sammlung von IKinectClient-Klassen enthält. Wann immer ein Videoframe bereit ist oder ein Sprachausdruck erkannt wird oder was sonst noch passiert, kann das Kinect-Plugin einen Delegierten auf jedem IKinectClient-Plug-in auslösen, das an diesem Ereignis interessiert ist (sich registriert hat). Auf diese Weise erhalten Sie einen zentralen Platz für Ihren tatsächlichen Kinect-Code und alle Änderungen, die Sie an der Interaktion Ihrer Anwendung mit dem Kinect-Sensor und/oder Kinect SDK vornehmen müssen, sind in einer einzigen Klasse zusammengefasst. Dies ist die Macht der Umkehrung der Kontrolle!

HINWEIS: Ich habe IKinectClient als Beispiel für die Schnittstelle angegeben, die Ihre kinect-bezogenen Schnittstellen möglicherweise unterstützen. In Wirklichkeit werden Sie wahrscheinlich kein einziges großes Interface für alle Kinect-Interaktionen benötigen. Stattdessen sollten Sie Ihre iTunes-Oberflächen verwerfen. z.B. IKinectSpeechClient, IKinectVideoClient, IKinectGestureClient, ect.

Mit dieser App müssen die Client-Kinect-Plug-Ins weder etwas über Kinect selbst wissen, noch etwas über die Kinect-API wissen (geben Sie das Tempo an, mit dem Kinect für Windows-SDKs veröffentlicht wird) Das ist ein großes Plus).

Ich habe an diesem Problem gearbeitet und darüber gebloggt hier:

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

Good Luck

+0

Danke für die Information, Ihre Idee ist großartig. Aber an erster Stelle halte ich meinen Weg, es zu tun. Ich repariere mein Problem, es war der zwei Konstruktor, der nicht erlaubt ist, ich setze alles in nur einen ein und es ist Arbeit. Noch einmal, danke für deine Idee, ich werde das bald tun. –

Verwandte Themen