2011-03-07 9 views

答えて

6

いいえ、ここでの発注は保証されていません。私たちはそれを可能にする拡張機能を考慮しましたが、現在は手動で扱うことがあります。

+0

それでは、最高の解決策は何ですか?メタデータを優先度 '優先度 'に追加し、それによって順序付けする必要がありますか? –

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

既に注文した場合はどうなりますか? –

4

私は自己宣伝に意味するものではありませんが、私は同様の必要性があったので、私はまた、この問題を解決するためのパッケージを作成している:それは宣言するIOrderedEnumerable < T>インターフェイスを使用していますhttps://github.com/mthamil/Autofac.Extras.Ordering

を注文の必要性

+0

registertypeでも機能しますか? –

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 **の発注を保証しているとは思わない。それ以外のことを述べている文書を参照していますか? –

+0

私はそれに関する文書を見つけられませんでしたが、私がそれに対して書いた単体テストから、彼らは合格しています。私は現在、自分のアプリケーションに使用しており、結果は一貫しています。 –

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)で秩序が賢明に保たれていると思います。

関連する問題