2011-03-07 29 views

Trả lời

6

Không, không có yêu cầu nào được đảm bảo tại đây. Chúng tôi đã xem xét các tiện ích mở rộng để kích hoạt nó nhưng bây giờ nó là một cái gì đó để xử lý bằng tay.

+0

Vậy giải pháp tốt nhất sau đó là gì? Tôi có nên thêm siêu dữ liệu vào 'Mức độ ưu tiên' và thứ tự của nó không? –

+0

Điều đó nghe có vẻ giống như một lựa chọn tốt. –

11

Giống như trợ giúp bổ sung cho những người như tôi truy cập trang này ... Dưới đây là ví dụ về cách người ta có thể làm điều đó.

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

Nếu bạn muốn tiêm nó đã được đặt hàng thì sao? –

4

Tôi không có ý để tự quảng bá, nhưng tôi cũng đã tạo ra một gói phần mềm để giải quyết vấn đề này bởi vì tôi có một nhu cầu tương tự: https://github.com/mthamil/Autofac.Extras.Ordering

Nó sử dụng IOrderedEnumerable < T> giao diện để khai báo sự cần thiết phải đặt hàng.

+0

Nó có hoạt động với registertype không? –

1

Tôi biết đây là một bài đăng cũ nhưng để duy trì thứ tự đăng ký, chúng tôi không thể sử dụng PreserveExistingDefaults() trong khi đăng ký?

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

Tôi không nghĩ rằng ** PreserveExistingDefaults ** có bất kỳ đảm bảo nào về ** IEnumerable ** order. Bạn có tham chiếu đến tài liệu nêu rõ không? –

+0

Tôi không tìm thấy bất kỳ tài liệu nào về nó nhưng từ các bài kiểm tra đơn vị mà tôi đã viết chống lại nó, họ đang đi qua. Tôi hiện đang sử dụng nó cho ứng dụng của tôi và kết quả đã được nhất quán. –

0

tôi không tìm thấy bất kỳ thông tin mới về chủ đề và viết một bài kiểm tra đó là đơn giản như (bạn nên viết riêng của bạn):

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 
    } 
} 

Thứ tự được giữ cho mọi trường hợp tôi đã đi lên với. Tôi biết nó không phải là đáng tin cậy, nhưng tôi nghĩ rằng trong phiên bản hiện tại của Autofac (4.6.0) đặt hàng được khôn ngoan giữ.

Các vấn đề liên quan