首页 / C# / c#-Autofac有序列表作为参数
c#-Autofac有序列表作为参数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-Autofac有序列表作为参数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1599字,纯文字阅读大概需要3分钟。
内容图文
我有一个对象,该对象采用项目的有序列表(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有序列表作为参数全部内容,希望文章能够帮你解决c#-Autofac有序列表作为参数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。