使用元数据进行Autofac排序

时间:2012-06-18 04:14:55

标签: .net autofac

我正在尝试通过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);

1 个答案:

答案 0 :(得分:1)

Autofac中的元数据作为IDictionary<string, object>存储在注册中,其中键是元数据名称,值是元数据值。这是在Autofac.Core.IComponentRegistration接口上定义的。

无论您使用哪种扩展名 - WithMetadataFrom<TAttribute>(通常在使用属性时使用)或WithMetadata(当您直接指定元数据时) - 这一切都归结为字符串/对象对。< / p>

这意味着就项目密钥而言,您将无法获得“强类型元数据”。你将永远需要在字符串中工作。

除此之外:如果您使用WithMetadataFrom,则不必将lambda放在那里以从元数据属性中选择Order属性。 WithMetadataFrom会自动获取可读属性属性的值,并将它们添加到字典中。