2011-03-07 14 views
7

इंजेक्शन करते समय निर्भरता का क्रम गारंटी है IMEService को लागू करने वाली कंटेनर सेवाओं में पंजीकरण करता हूं।IENumerable <T>

मैं

container.Resolve<IEnumerable<IMyService>> 

में अपने आदेश के बारे में कोई गारंटी देता है?

उत्तर

6

नहीं, यहां कोई ऑर्डरिंग की गारंटी नहीं है। हमने एक्सटेंशन को सक्षम करने के लिए विचार किया है लेकिन अभी के लिए यह मैन्युअल रूप से संभालने के लिए कुछ है।

+0

तो फिर सबसे अच्छा समाधान क्या है? क्या मुझे मेटाडाटा int 'प्राथमिकता' और इसके द्वारा क्रमबद्ध करना चाहिए? –

+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

मैं स्वयं को बढ़ावा देने के मतलब नहीं है, लेकिन मैं भी एक पैकेज बनाया है इस समस्या को हल करने के लिए है क्योंकि मैं एक ऐसी ही जरूरत थी: https://github.com/mthamil/Autofac.Extras.Ordering

यह IOrderedEnumerable < टी का उपयोग करता है> इंटरफेस घोषित करने के लिए आदेश की आवश्यकता है।

+0

क्या यह रजिस्टर टाइप के साथ भी काम करता है? –

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

आदेश सभी मामलों के लिए रखा गया था मैं साथ आ गया है मुझे पता है कि यह विश्वसनीय नहीं है, लेकिन मुझे लगता है कि ऑटोफैक (4.6.0) ऑर्डरिंग के वर्तमान संस्करण में बुद्धिमानी से रखा गया है।

संबंधित मुद्दे