1

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

1 回答 1

1

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

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

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

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

于 2012-06-18T15:19:45.273 回答