Wie bringe ich MEF dazu, sich neu zusammenzusetzen, wenn ich ein Teil ändere?

Ich versuche, MEF dazu zu bringen, alle ihm bekannten Teile neu zusammenzustellen, wenn ich eine exportierte Instanz aktualisiere. Grundsätzlich möchte ich, dass MEF alle meine Teile aktualisiert, die einen Verbindungszeichenfolgen-Konfigurationswert importieren, wenn dieser geändert wird. Bis zu dem Punkt, an dem ich die Instanz ändern möchte, sieht alles gut aus. Wenn ich versuche, ComposeParts mit dem aktualisierten Wert zu erstellen, scheint dem Container eine zweite Teilinstanz hinzuzufügen, und dann werden meine Importe aktualisiert, jedoch auf Null.

ann jemand darauf hinweisen, wo ich falsch liege? Oder sollte ich überhaupt versuchen, MEF auf diese Weise zu verwenden?

Ich verwende MEF Preview 9 und das Targeting von .NET Framework 3.5 und WPF.

using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Linq;
using System.Text;
using Shouldly;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            MainClass main = new MainClass();
            main.RunTest();
        }
    }

    public class MainClass
    {
        [ImportMany]
        public IEnumerable<Settings> Settings { get; set; }

        public void RunTest()
        {
            AggregateCatalog catalog = new AggregateCatalog();
            catalog.Catalogs.Add(new AssemblyCatalog(typeof(Settings).Assembly));

            CompositionContainer container = new CompositionContainer(catalog);

            container.SatisfyImportsOnce(this);

            Config cfg = new Config
            {
                Settings = new Settings { ConnectionString = "Value1" },
            };

            // result is returned with a null settings value
            UsesSettings result = container.GetExportedValue<UsesSettings>();

            // this recomposes everything with the new value, result changes to have settings of Value1
            container.ComposeParts(cfg);

            // this line results in my import many enumerable returning 2 parts the Value1 setting and null
            container.SatisfyImportsOnce(this);

            result.TheSettings.ConnectionString.ShouldBe("Value1");

            cfg.Settings = new Settings { ConnectionString = "Value2" };

            // how do I tell the container to recompose now I have changed the config object,
            // or how do I replace the part value with the new value?

            // this line causes the result.Settings to return null
            container.ComposeParts(cfg);

            // this updates the ImportMany to 3 values, Value1, Value2 and null
            container.SatisfyImportsOnce(this);
        }
    }

    public class Settings
    {
        public string ConnectionString = "default value";
    }

    public class Config
    {
        [Export(typeof(Settings))]
        public Settings Settings { get; set; }
    }

    [Export(typeof(UsesSettings))]
    public class UsesSettings
    {
        [Import(typeof(Settings), AllowRecomposition = true)]
        public Settings TheSettings { get; set; }
    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage