2011-03-07 76 views

回答

6

不,这里没有保证的顺序。我们已经考虑过启用它的扩展,但现在它是手动处理的东西。

+0

那么最好的解决方案是什么?我应该添加元数据诠释'优先',并由它命令? – 2011-03-11 10:45:33

+0

这听起来像一个不错的选择。 – 2011-03-12 08:07:13

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; 
    } 
    } 
+0

如果你想注入它已经订购了什么? – 2016-11-15 17:32:37

4

我并不想自我宣传,但我还创建了一个包,因为我也有类似的需要来解决这个问题:https://github.com/mthamil/Autofac.Extras.Ordering

它使用IOrderedEnumerable < T>接口声明需要订购。

+0

它是否也适用于registertype? – 2016-11-15 17:36:31

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>>(); 
+0

我不认为** PreserveExistingDefaults **对IEnumerable **排序有任何保证。你有没有提到另有说明的文档? – 2015-04-27 03:34:02

+0

我没有找到任何文档,但从我写的单元测试来看,它们都通过了。我目前正在将它用于我的应用程序,并且结果一直保持一致。 – 2015-04-28 12:50:02

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)订购中明智地保留。