Silnie wpisane metadane w MEF2 (System.Composition)

Używam przestrzeni nazw System.Composition odMEF dla aplikacji internetowych i Windows Store Pakiet NuGet w nowym projekcie ASP.NET MVC4.

Jaczytać że w MEF2 już nie używaszLazy<IExtension, IExtensionMetadata>, ale teraz musisz podać konkretny typ widoku metadanych (i ewentualnie użyć ExportFactory <> zamiast Lazy <>?).

Jednak nie mogę znaleźć żadnych przykładów, jak to wszystko powinno działać - tylko kilka wzmianek o użyciu konkretnego typu zamiast interfejsu.

Wypróbowałem kilka rzeczy, ale otrzymuję następujący błąd - „Brakuje eksportowanych metadanych dla „AccountID” i nie podano żadnej wartości domyślnej„

Mój kod ...

Tworzenie kontenera (w folderze Global.asax lub App_Start):

// Get assemblies that will be providing imports and exports
var assemblies = GetAssemblies();

// Get conventions that will be used to find imports and exports
var conventions = GetConventions();

var container = new ContainerConfiguration().WithAssemblies(assemblies, conventions).CreateContainer();

// Create and apply a MefControllerFactory so controllers can be composed
ControllerBuilder.Current.SetControllerFactory(new MefControllerFactory(container));

Metoda GetConventions ():

private static ConventionBuilder GetConventions()
{
    var conventionBuilder = new ConventionBuilder();
    conventionBuilder.ForTypesDerivedFrom<IController>().Export();

    conventionBuilder.ForTypesDerivedFrom<IExtension>().Export<IExtension>();
    conventionBuilder.ForTypesMatching(t => t.Namespace != null && t.Namespace.EndsWith(".Parts")).Export().ExportInterfaces();

    return conventionBuilder;
}

IExtension.cs:

public interface IExtension
{
    void DoWork();
}

ExtensionMetadata.cs:

public class ExtensionMetadata
{
    public int AccountID { get; set; }
}

ExtensionA.cs (tak samo jak ExtensionB.cs):

public void DoWork()
{
    System.Diagnostics.Debug.WriteLine("ExtensionA doing work..");
}

ExtensionManager.cs:

public class ExtensionManager
{       
    private IEnumerable<ExportFactory<IExtension, ExtensionMetadata>> _extensions;

    public ExtensionManager(IEnumerable<ExportFactory<IExtension, ExtensionMetadata>> extensions)
    {
        _extensions = extensions;
    }

    public void DoWork(int accountID)
    {
        foreach (var extension in _extensions)
        {
            if (extension.Metadata.AccountID == accountID)
            {
                extension.DoWork();
            }                   
        }           
    }
}

Myślę, że brakuje mi tutaj czegoś ważnego. Zasadniczo chcę leniwie zaimportować wszystkie rozszerzenia, sprawdzić ich metadane i jeśli warunek zostanie spełniony, czy to rozszerzenie coś zrobić.

Byłbym wdzięczny za Twoją opinię lub linki do przykładowego kodu / samouczków, które obejmują mój scenariusz.

Wielkie dzięki!

questionAnswers(1)

yourAnswerToTheQuestion