我在实现IMyService的容器服务中注册。注入IEnumerable时是否保证依赖关系的顺序<T>
难道我对他们为了任何保证在
container.Resolve<IEnumerable<IMyService>>
?
我在实现IMyService的容器服务中注册。注入IEnumerable时是否保证依赖关系的顺序<T>
难道我对他们为了任何保证在
container.Resolve<IEnumerable<IMyService>>
?
不,这里没有保证的顺序。我们已经考虑过启用它的扩展,但现在它是手动处理的东西。
正如对像我登陆这个网页的人一样的额外帮助......下面是一个如何能够做到这一点的例子。
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;
}
}
如果你想注入它已经订购了什么? – 2016-11-15 17:32:37
我并不想自我宣传,但我还创建了一个包,因为我也有类似的需要来解决这个问题:https://github.com/mthamil/Autofac.Extras.Ordering
它使用IOrderedEnumerable < T>接口声明需要订购。
它是否也适用于registertype? – 2016-11-15 17:36:31
我知道这是一个旧的帖子,但为了维护注册的顺序,我们不能只在注册期间使用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>>();
我不认为** PreserveExistingDefaults **对IEnumerable
我没有找到任何文档,但从我写的单元测试来看,它们都通过了。我目前正在将它用于我的应用程序,并且结果一直保持一致。 – 2015-04-28 12:50:02
我没有找到主题的任何新的信息,并写了一个测试,很简单,只要(你最好写你自己的):
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)订购中明智地保留。
那么最好的解决方案是什么?我应该添加元数据诠释'优先',并由它命令? – 2011-03-11 10:45:33
这听起来像一个不错的选择。 – 2011-03-12 08:07:13