2009-11-20 4 views
19

MEF umożliwia importowanie wielu części za pomocą atrybutu ImportMany. W jaki sposób określa kolejność, w jakiej pobiera odpowiednie eksporty i dodaje je do pola przeliczalnego, które wypełniasz? Na przykład, w jaki sposób mogę zaimportować wiele IRI, które musiały wystrzelić w określonej kolejności? Jedynym sposobem mogę myśleć jest posiadanie własności OrderValue w IRule i sortować ręcznie:W jaki sposób MEF określa kolejność importu?

public class Engine 
{ 
    [ImportMany] 
    public IEnumerable<IRule> Rules { get; set; } 

    public void Run() 
    { 
    // ... 
    // Initialise MEF 
    // ... 

    // 
    // Do I need to manually order Rules here? 
    // 

    foreach (IRule rule in Rules) 
    { 
     // Must execute in a specific order 
     rule.Execute(); 
    } 
    } 
} 
+0

Myślę, że założenie jest poprawne - wydaje się trochę poza problemu MEF jest przeznaczona do rozwiązania. – GraemeF

Odpowiedz

29

Domyślnie MEF nie gwarantuje żadnej kolejności wywozu, który zostanie zaimportowany. Jednak w MEF możesz zrobić porządek, używając metadanych i kolekcji niestandardowej. Na przykład możesz zrobić coś takiego:

public interface IRule { } 

[Export(typeof(IRule))] 
[ExportMetadata("Order", 1)] 
public class Rule1 : IRule { } 

[Export(typeof(IRule))] 
[ExportMetadata("Order", 2)] 
public class Rule2 : IRule { } 

public interface IOrderMetadata 
{ 
    [DefaultValue(Int32.MaxValue)] 
    int Order { get; } 
} 

public class Engine 
{ 
    public Engine() 
    { 
     Rules = new OrderingCollection<IRule, IOrderMetadata>(
          lazyRule => lazyRule.Metadata.Order); 
    } 

    [ImportMany] 
    public OrderingCollection<IRule, IOrderMetadata> Rules { get; set; } 
} 

Będziesz mieć zestaw reguł uporządkowanych według metadanych. Próbkę OrderingCollection można znaleźć pod adresem http://codepaste.net/ktdgoh.

+0

Dzięki! Zmieniłem zaakceptowaną odpowiedź na twoją. –

+0

Świetne rozwiązanie! – Kilhoffer

+0

Wygląda na to, że próbka OrderingCollection nie jest już dostępna. – tofutim

1

Mogłeś zasady importu siebie w kolejności (przy użyciu wzorca Dekorator), ale każda reguła będzie musiał wiedzieć o konkretnej regule, która ją poprzedza, co prawdopodobnie nie jest tym, czego chcesz.

MEF jest po to, aby pomóc Ci odkryć części, a następnie, co z nimi zrobisz, zależy od Ciebie. Jeśli chcesz posortować części, to śmiało, nie ma w tym nic złego!

+0

Potwierdziło to, czego się spodziewałem, dzięki. –

+0

Dla mnie wydaje się bardziej wydajne wstawianie elementów do posortowanej listy niż generowanie listy, a następnie sortowanie – Assimilater

6

Najlepszym sposobem na uzyskanie tego zamówienia w MEF jest wykorzystanie naszych urządzeń metadanych. Możesz dołączyć własne metadane do eksportów, których możesz użyć do zamawiania i filtrowania. Metadane umożliwiają również opóźnianie instancji części, dopóki nie będą one faktycznie potrzebne. Dodatkowo możesz utworzyć niestandardowe atrybuty eksportu, które zapewniają ładny, czysty sposób dostarczania metadanych.

Sprawdź ten link do informacji na temat sposobu definiowania eksport metadanych i niestandardowe: link text

można również znaleźć this wątek na naszym forum MEF użytecznych. Wewnątrz znajdziesz dyskusję na temat metody AdaptingCollection, która umożliwia korzystanie z kolekcji niestandardowej, która stosuje filtr/kolejność metadanych.

HTH Glenn

+0

Dzięki Glenn, w końcu podjąłem inne podejście, ale na pewno będę o tym pamiętać na następny raz. Przyjmuję twoją odpowiedź, ale jak Wes już wcześniej przyszedł z podobną reakcją, myślę, że prawdopodobnie lepiej jest zaakceptować jego. –

+0

W porządku, Wes oparł swoją wersję na mojej :-) –