我正在尝试通过Autofac解析IEnumerable的依赖关系,但我需要能够以某种方式对它们进行排序。我以为我会使用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);
答案 0 :(得分:1)
Autofac中的元数据作为IDictionary<string, object>
存储在注册中,其中键是元数据名称,值是元数据值。这是在Autofac.Core.IComponentRegistration
接口上定义的。
无论您使用哪种扩展名 - WithMetadataFrom<TAttribute>
(通常在使用属性时使用)或WithMetadata
(当您直接指定元数据时) - 这一切都归结为字符串/对象对。< / p>
这意味着就项目密钥而言,您将无法获得“强类型元数据”。你将永远需要在字符串中工作。
除此之外:如果您使用WithMetadataFrom
,则不必将lambda放在那里以从元数据属性中选择Order属性。 WithMetadataFrom
会自动获取可读属性属性的值,并将它们添加到字典中。