Home > Managed Extensibility Framework > MEF Teil 2 – Metadaten und Erstellungsrichtlinien
  1. Uwe Thomas
    June 7, 2011 at 7:06 pm

    Hi Stefan,

    Ich bin auch ein Freund von MEF.
    Super Artikel! Bin schon auf den nächsten Teil gespannt.
    Nur eine Kleinigkeit:
    Als Du das Audio System eingeführt hast, hast Du auch das ICarMetadata Interface um ein Audio Property erweitert. Das solltest Du noch mal abbilden.

    Viele Grüße
    Uwe

  2. Alex
    June 29, 2012 at 1:42 pm

    Hy, Stefan, in dem Interface ist auf einmal der namespace “CarContract”. In Deinem Sample01 ist der namespace CarHost.

    Was ist denn nun richtig??

    Als Anfänger ist das sehr verwirrend.

    Liebe Grüße

    Alex

  3. July 2, 2012 at 12:10 pm

    Hallo Alex,
    die einzelnen Assemblies können verschiedene Namespaces haben; warum auch nicht? Host, Contract und AddIns liegen bei meinen Beispielen in separate Assemblies. Die Beispiele für Visual Studio, die du dir runterladen kannst, helfen dir hoffentlich weiter.

    Stefan

  4. Alex
    July 2, 2012 at 1:45 pm

    Danke für die rasche Antwort.
    Prima Artikel. Ich habe zum erstenmal die Funktion des MEF verstanden. Jetzt heißt es üben, üben, üben….

  5. Rolf
    September 19, 2012 at 11:38 am

    Hallo Stefan, eine kurze Verständnisfrage:

    Bei dem letzten Beispiel mit den drei Listen (1 unshared, 2 shared, also mit Sebastian, Michael und Stefan): welche Creation Policy ist hier für den Export eingestellt? Deinen Ausführungen von oben nach müsste das doch dann Any (bzw. ohne Angabe) sein, oder täusche ich mich da?

    (der Sourcecode zu diesem Beispiel ist in den Samples nicht vorhanden)

    Gruß
    Rolf

    • September 25, 2012 at 8:57 pm

      Hallo Rolf,
      als Grundlage kannst du Sample06 benutzen. Die Methode Run() muss dann wie folgt aussehen:

      var catalog = new DirectoryCatalog(“.”);
      var container = new CompositionContainer(catalog);
      container.ComposeParts(this);
      foreach (Lazy car in CarPartsA)
      Console.WriteLine(car.Value.StartEngine(“Sebastian”));
      Console.WriteLine(“”);
      foreach (Lazy car in CarPartsB)
      Console.WriteLine(car.Value.StartEngine(“Michael”));
      Console.WriteLine(“”);
      foreach (Lazy car in CarPartsC)
      Console.WriteLine(car.Value.StartEngine(“Stefan”));
      container.Dispose();

      Bei den Exports muss
      [PartCreationPolicy(CreationPolicy.Any)]
      angegeben werden. Alternativ kann das Attribut PartCreationPolicy entfallen.

      Stefan

  6. Rolf
    September 20, 2012 at 5:11 pm

    Hallo Stefan,

    nochmals eine wahrscheinlich typische Anfängerfrage.

    Ich habe gerade Dein Beispiel 4 ausprobiert, da ich aktuell gerade an einem Teilproblem eines größeren Projektes sitze, das vom formalen Aufbau her nahezu identisch ist. Mir ist jetzt aufgefallen, dass bei allen Autoklassen mindestens eine Zeile

    [CarMetadataAudio(AudioSystem.———)]

    erforderlich ist. Wenn man z.B. bei der Merdesklasse diese Zeile auskommentiert (ein Mercedes ohne Audiosystem? – na gibt es sowas?…), kommt es zu einer CompositionContractMismatchException

    “Unable to create an Instance of the Metadata view ‘CarContract.ICarMetadata’ because the exporter exported the metadata for the item ‘Audio’ with the value ‘Without’ as type ‘CarContract.AudioSystem’ but the view imports it as type ‘CarContract.AudioSystem[]’.”
    ,

    wenn im Interface ICarMetadata der Eintrag [DefaultValue(AudioSystem.Without)] drinsteht.

    Der Exporttyp AudioSystem passt nicht mit dem Importtyp Array AudioSystem[] zusammen, wenn AudioSystem.Without als Default drinsteht. Leuchtet mir auch irgendwie ein.

    Aber wie realisiert man dann am besten ein leeres Array AudioSystem[] in den Metadaten?

    Bem.: Beim Ersetzen des Eintrags durch “[DefaultValue(null)]” wird zwar keine Exception mehr geworfen und die Metadaten zum anderen Auto BMW kommen auch richtig, aber das kann wohl kaum eine besonders sinnvolle Lösung sein, da dann anstelle eines Arrays eine Nullreference vorhanden wäre, die man im Composable Part abfangen müsste.)

    Gruß
    Rolf

    • September 25, 2012 at 9:22 pm

      Hi Rolf,

      teste mal folgendes Attribut:

      [DefaultValue((object)(new AudioSystem[0]))]
      AudioSystem[] Audio { get; }

      Der Defaultwert wird dadurch eine leere Liste vom Typ AudioSystem[].

      Stefan

      • Karl Napf
        December 2, 2014 at 2:15 pm

        Statt
        [DefaultValue((object)(new AudioSystem[0]))]
        würde ich
        [DefaultValue(new [] {AudioSystem.Without}]
        nehmen.
        Dann hat man nicht ne leere Liste sondern den ursprünglich gewollten Default Wert als einziger Wert in dem Array.

  7. Jürgen
    June 14, 2013 at 9:51 am

    Super Reihe – Danke Stefan!!

  8. Sven
    March 14, 2014 at 1:08 pm

    Super Artikel, leider fehlt im Car-Beispiel Variante 2 (typsicherer Zugriff) wie man das Interface ICarMetadata als ExportMetadata-Attribut angeben muss…

  9. November 2, 2015 at 3:49 pm

    Hallo Stefan, prima Tutorial! Sehr gut! Vielen Dank! Bitte erwähne noch, dass
    [MetadataAttribute] in System.ComponentModel.Composition enthalten ist!

  1. November 21, 2011 at 12:49 pm
  2. December 6, 2011 at 9:18 pm
  3. December 6, 2011 at 9:23 pm
  4. February 9, 2012 at 8:56 pm
  5. January 21, 2013 at 11:33 pm

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: