2012-06-18 29 views
1

我試圖通過Autofac來解析IEnumerable的依賴關係,但我需要能夠以某種方式對它們進行排序。我以爲我會使用Autofac的元數據來實現這一點,但我不能讓它工作:Autofac使用元數據排序

這是註冊碼:

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

所以我需要映射值的屬性在我的班上。

[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,則不必將lambda放在那裏以從元數據屬性中選擇Order屬性。 WithMetadataFrom自動獲取可讀屬性屬性的值並將它們添加到字典中。