我有一个对象,它采用项目的有序列表(IOrderedEnumerable),其中项目的顺序很重要。
public class OrderedListWorker : IListWorker
{
private OrderedListWorker(IOrderedEnumerable<IListItem> orderedListItems)
{
foreach (var listItem in orderedListItems)
listItem.DoSomethingWhereOrderMatters();
}
}
我有多个
IListItem
类型的对象。如何使用 Autofac 注册
OrderedListWorker
并确保在运行时以特定顺序获取 ListItems?我看到 This Post 不能保证订单,但我不确定如何保证订单。
最佳答案
我有一个解决方案,即 IOrderedEnumerable
和我上面链接的帖子中的 ResolveOrdered<TComponent>
解决方案的组合。
使用 AutofacExtensions 类:
public static class AutofacExtensions
{
private const string OrderString = "WithOrderTag";
private static int _orderCounter;
public static IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle>
WithOrder<TLimit, TActivatorData, TRegistrationStyle>(
this IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle> registrationBuilder)
{
return registrationBuilder.WithMetadata(OrderString, Interlocked.Increment(ref _orderCounter));
}
public static IOrderedEnumerable<TComponent> ResolveOrdered<TComponent>(this IComponentContext context)
{
return
context.Resolve<IEnumerable<Meta<TComponent>>>()
.OrderBy(m => m.Metadata[OrderString])
.Select(m => m.Value).OrderBy(c => true);
}
}
我可以指定我的注册如下:
builder.RegisterType<ListItemA>().As<IListItem>().WithOrder();
builder.RegisterType<ListItemB>().As<IListItem>().WithOrder();
builder.RegisterType<OrderedListWorker>()
.As<IListWorker>()
.WithParameter(
new ResolvedParameter(
(info, context) => true,
(info, context) => context.ResolveOrdered<IListItem>()));
关于c# - Autofac 有序列表作为参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17863561/