我在实现IMyService的容器服务中注册。
我对
中的订单有任何保证吗?container.Resolve<IEnumerable<IMyService>>
答案 0 :(得分:11)
就像我这样的人登陆这个页面的额外帮助...这是一个如何做到这一点的例子。
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 IEnumerable<TComponent> ResolveOrdered<TComponent>(this IComponentContext context)
{
return from m in context.Resolve<IEnumerable<Meta<TComponent>>>()
orderby m.Metadata[OrderString]
select m.Value;
}
}
答案 1 :(得分:7)
不,这里没有保证订购。我们已经考虑过扩展来启用它,但现在它可以手动处理。
答案 2 :(得分:4)
我不是故意自我推销,但我也创建了一个解决这个问题的方案,因为我有类似的需求:https://github.com/mthamil/Autofac.Extras.Ordering
它使用IOrderedEnumerable&lt; T&gt;接口声明需要订购。
答案 3 :(得分:1)
我知道这是一个旧帖子,但为了维持注册顺序,我们只能在注册时使用PreserveExistingDefaults()吗?
builder.RegisterInstance(serviceInstance1).As<IService>().PreserveExistingDefaults();
builder.RegisterInstance(serviceInstance2).As<IService>().PreserveExistingDefaults();
// services should be in the same order of registration
var services = builder.Resolve<IEnumberable<IService>>();
答案 4 :(得分:0)
我没有找到关于主题的任何新信息,并写了一个简单的测试(你最好自己编写):
var cb = new ContainerBuilder();
cb.RegisterType<MyClass1>().As<IInterface>();
// ...
using (var c = cb.Build())
{
using (var l = c.BeginLifetimeScope())
{
var e = l.Resolve<IEnumerable<IInterface>>().ToArray();
var c = l.Resolve<IReadOnlyCollection<IInterface>>();
var l = l.Resolve<IReadOnlyList<IInterface>>();
// check here, ordering is ok
}
}
对于我提出的所有案件都保留了订购。我知道它不可靠,但我认为在当前版本的Autofac(4.6.0)订购中明智地保留了。