2012-06-18 3 views
1

Autofac을 통해 내 종속성의 IEnumerable을 해결하려고하지만 어떻게 든 정렬 할 수 있어야합니다. 내가이 값을 매핑 할 필요가 물음표에 따라서메타 데이터를 사용하여 자동 채우기

builder.RegisterAssemblyTypes(assemblies.ToArray()) 
    .AssignableTo<IDiscoverable>() 
    .As<IDiscoverable>() 
    .AsImplementedInterfaces() 
    .WithMetadata<DisplayOrderAttribute>(c => c.For(x => x.Order, ???)); 

:

이것은 등록 코드 : 나는 그것을 달성하기 위해 Autofac의 메타 데이터를 사용하는 거라고,하지만 난 그것이 작동 할 수 없습니다 생각 내 수업에 대한 속성.

[DisplayOrder(5)] 
public class Test : IDiscoverable 
{ 
} 

[DisplayOrder(1)] 
public class Test : IDiscoverable 
{ 
} 

그래서이를 해결 때, 나는 정렬 된 컬렉션을 얻을 수있어 것을 :

어쨌든
public class Client 
{ 
    public Client(IEnumerable<Meta<IDiscoverable>> discoverables) 
    { 
     //sort it using metadata here 
     var sortedDiscoverables = discoverables.Sort(x => x.Order).Select(x => x.Value); 
    } 
} 

이 Autofac에 그것을 달성하기를?

[업데이트] 형식이없는 메타 데이터를 사용하여 다음을 수행 할 수 있지만 입력 된 메타 데이터 개체를 사용하여이를 수행 할 수있는 방법을 찾을 수 없습니다.

.WithMetadata("Order", x => x.GetAttribute<DisplayOrderAttribute>().Order); 

답변

1

메타 Autofac에서이 키 메타 데이터 명, 값이 메타 데이터 값 인 IDictionary<string, object>로서 등록에 저장된다. 이것은 Autofac.Core.IComponentRegistration 인터페이스에서 정의됩니다.

확장자에 관계없이 - WithMetadataFrom<TAttribute> (일반적으로 속성 작업시 사용) 또는 WithMetadata (메타 데이터를 직접 지정하는 경우) - 문자열/객체 쌍이 모두 사용됩니다.

은 항목 키가 관련되어있는 한 "강력한 형식의 메타 데이터"를 가져올 수 없습니다.. 항상 문자열로 작업해야합니다.

제외 : WithMetadataFrom을 사용하면 메타 데이터 속성에서 Order 속성을 선택하기 위해 람다를 넣을 필요가 없습니다. WithMetadataFrom은 자동으로 읽을 수있는 속성 속성 값을 가져 와서 사전에 추가합니다.

관련 문제