2009-11-20 3 views
19

MEF를 사용하면 ImportMany 특성을 사용하여 여러 부분을 가져올 수 있습니다. 해당 내보내기를 검색하는 순서를 어떻게 결정하며 사용자가 채우는 열거 형에 추가합니다. 예를 들어 특정 순서로 실행해야하는 여러 개의 IRules을 어떻게 가져올 수 있습니까? 내가 생각할 수있는 유일한 방법은 일종의 수동으로 OrderValue의 아이 룰의 재산과하는 것입니다 :MEF는 수입 주문을 어떻게 결정합니까?

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

나는 당신의 가정이 올바른 생각합니다. – GraemeF

답변

29

기본적으로 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에 있습니다.

+0

고마워요! 내 대답을 너의 것으로 바꿨다. –

+0

그레이트 솔루션! – Kilhoffer

+0

OrderingCollection 샘플을 더 이상 사용할 수없는 것 같습니다. – tofutim

1

당신은 규칙 (데코레이터 패턴을 사용하여) 위해 서로를 가져 가질 수있다, 그러나 각 규칙이 필요합니다 그 앞에있는 특정 규칙에 대해 알고 있어야합니다. 이는 아마도 당신이 원하는 것이 아닙니다.

MEF는 부품을 발견하는 데 도움을주기 위해 나중에 부품 번호를 결정합니다. 부품을 정렬하고 싶다면 계속 진행하십시오.

+0

이것은 내가 기대했던 것을 확인해 주었다. –

+0

저에게 목록을 생성 한 다음 정렬하는 것보다 정렬 된 목록에 요소를 삽입하는 것이 더 효율적입니다. – Assimilater

6

MEF에서이 순서를 얻는 가장 좋은 방법은 메타 데이터 기능을 활용하는 것입니다. 주문 및 필터링에 사용할 수있는 내보내기에 자신의 메타 데이터를 첨부 할 수 있습니다. 또한 메타 데이터를 사용하면 파트가 실제로 필요할 때까지 인스턴스화를 지연 할 수 있습니다. 또한 메타 데이터를 제공하는 훌륭한 방법을 제공하는 사용자 지정 내보내기 특성을 만들 수 있습니다.

확인 메타 데이터 및 사용자 정의 수출 정의하는 방법에 대한 자세한 내용은이 링크 : 당신은 또한 유용한 우리의 MEF 포럼에 this 스레드를 찾을 수 있습니다 link text

합니다. 그 안에는 메타 데이터 필터/주문을 적용하는 사용자 정의 컬렉션을 사용할 수있게 해주는 AdaptingCollection 방식에 대한 토론이 있습니다. 그것은 MEF가 해결하고자하는 문제의 약간 바깥 쪽을 보인다 -

HTH 글렌

+0

고마워 글렌, 결국 다른 접근법을 택했지만 다음 번에는 확실히이 점을 명심 할 것입니다. 나는 당신의 대답을 받아 들일 것입니다.하지만 Wes가 비슷한 반응으로 직전에 들어 왔을 때 나는 그를 받아들이는 것이 더 공정하다고 생각합니다. –

+0

괜찮아요, 웨스가 내 버전을 기반으로 :-) –