注入IEnumerable <t> </t>时是否保证依赖顺序

时间:2011-03-07 10:56:31

标签: ienumerable autofac

我在实现IMyService的容器服务中注册。

我对

中的订单有任何保证吗?
container.Resolve<IEnumerable<IMyService>>

5 个答案:

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