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

Kon*_*rin 11 ienumerable autofac

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

我对他们的订单有任何保证吗?

container.Resolve<IEnumerable<IMyService>>
Run Code Online (Sandbox Code Playgroud)

Dir*_*nné 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;
    }
  }
Run Code Online (Sandbox Code Playgroud)


Nic*_*rdt 8

不,这里没有保证订购.我们已经考虑过扩展来启用它,但是现在它可以手动处理.


Mat*_*t H 5

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

它使用 IOrderedEnumerable<T> 接口来声明需要排序。