Подтвердить что ты не робот

Как MEF определяет порядок его импорта?

MEF позволяет импортировать несколько частей с помощью атрибута ImportMany. Как он определяет порядок, в котором он извлекает соответствующий экспорт, и добавляет их к перечислимому вами населению? Например, как мне импортировать несколько IRules, которые должны были запускаться в определенном порядке? Единственный способ, которым я могу думать, - иметь свойство OrderValue в IRule и отсортировать вручную:

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();
    }
  }
}
4b9b3361

Ответ 1

По умолчанию MEF не гарантирует порядок экспорта, который импортируется. Однако в MEF вы можете сделать некоторые заказы, используя некоторые метаданные и пользовательскую коллекцию. Например, вы можете сделать что-то вроде:

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; }
}

Затем у вас будет набор правил, упорядоченных по метаданным. Вы можете найти образец OrderingCollection в http://codepaste.net/ktdgoh.

Ответ 2

Лучший способ добиться этого заказа в MEF - использовать наши средства метаданных. Вы можете приложить свои собственные метаданные к экспорту, которые вы можете использовать для упорядочения и фильтрации. Метаданные также позволяют задерживать создание частей, пока они не понадобятся. Кроме того, вы можете создавать настраиваемые атрибуты экспорта, которые обеспечивают хороший чистый способ предоставления метаданных.

Посмотрите эту ссылку для получения информации о том, как определить метаданные и пользовательский экспорт: текст ссылки

Вы также можете найти эту нить на наших форумах MEF. Внутри вы найдете обсуждение подхода AdaptingCollection, который позволяет использовать пользовательскую коллекцию, которая применяет фильтр/порядок метаданных.

НТН Гленн

Ответ 3

У вас могут быть правила, которые импортируют друг друга по порядку (используя шаблон Decorator), но тогда каждое правило должно знать о том, какое предшествующее ему правило, что, вероятно, не то, что вы хотите.

MEF поможет вам разобраться в деталях, что вы делаете с ними, зависит от вас. Если вы хотите отсортировать детали, тогда вперед, нет ничего плохого в этом!