5

autofac विकि पृष्ठ के बारे में Circular References उपयोग करने के लिए कहते हैं:Autofac 2.4.5 के साथ परिपत्र संदर्भों को कैसे संभालें?

cb.Register<DependsByProp>().OnActivated(ActivatedHandler.InjectUnsetProperties); 

लेकिन जैसे ActivatedHandler 2.4.5 में अब मौजूद नहीं है यह लग रहा है। स्रोत में चारों ओर खोदने पर, मुझे उस वर्ग के कार्यान्वयन को मिला, और इसलिए मैंने इसके बजाय ऑनएक्टिव में विधि कार्यान्वयन किया। दुर्भाग्यवश, यह अभी भी काम नहीं करता है।

मैंने यहां एक न्यूनतम रेपो लगाया है जो विकी पेज पर क्या था।

class M 
{ 
    public VM VM { get; set; } 

    public M() 
    { 
    } 
} 

class VM 
{ 
    public VM(M m) 
    { 
    } 
} 

[Fact] 
void CanResolveCircular() 
{ 
    ContainerBuilder builder = new ContainerBuilder(); 

    builder.RegisterType<VM>(); 
    builder.RegisterType<M>().OnActivated(e => e.Context.InjectUnsetProperties(e.Instance)); 

    using (var container = builder.Build()) 
    { 
     var m = container.Resolve<M>(); 
     Assert.NotNull(m); 
    } 
} 

यह कोड अभी भी एक स्टैक ओवरफ़्लो अपवाद फेंकता है क्योंकि संकल्प का प्रयास किया जाता है। मैं क्या खो रहा हूँ? सर्कुलर निर्भरताओं को संभालने के लिए ऑटोफैक प्राप्त करने का सही तरीका क्या है?

+0

हां। मैंने सोचा कि परिपत्र निर्भरता का मतलब उदाहरण चक्र के समान है। नीचे दिए गए आपके उत्तर ने कक्षाओं और उदाहरणों के बीच परिपत्र निर्भरताओं की अवधारणाओं के बारे में क्या खोया था, यह बताया। – Ants

उत्तर

7

circular dependencies राज्यों के लिए Autofac प्रलेखन:

ध्यान दें, यह इस परिदृश्य स्थापित करने के लिए करता है, तो दोनों वर्गों फैक्टरी गुंजाइश के साथ पंजीकृत हैं मतलब नहीं है।

दोनों अपने M और VM पंजीकरण InstancePerDependency (पहले FactoryScope के रूप में जाना जाता है) कर रहे हैं ताकि इस बयान अपने परिदृश्य पर लागू होता है। नतीजतन, आप एम और वीएम उदाहरण बनाने के अंतहीन पाश में मिलता है।

यदि आप चाहते हैं संपत्ति इंजेक्शन VMएक ही उदाहरण M की है कि आप को हल लेने के लिए, आप की तुलना में InstancePerDependency (जैसे SingleInstance) अन्य कुछ करने के लिए M के जीवनकाल बदलना चाहिए। यह नीचे दिखाया गया है:

builder.RegisterType<M>().PropertiesAutowired(true).SingleInstance(); 

नोट: मैं भी अधिक हाल ही में PropertiesAutowired (सही) विस्तार विधि का उपयोग कर रहा हूँ। आप इसे अपने रेपो में ऑनएक्टिव कोड के स्थान पर उपयोग कर सकते हैं।

आप M प्रति ऐप्लिकेशन का एक उदाहरण नहीं करना चाहते हैं, तो आप सेटअप कर सकते थे एक LifetimeScope और InstancePerLifetimeScope का उपयोग करें।

5

यहाँ रुचि किसी के लिए ऐसा करने का नया तरीका है:

class DependsByProp1 
{ 
    public DependsByProp2 Dependency { get; set; } 
} 

class DependsByProp2 
{ 
    public DependsByProp1 Dependency { get; set; } 
} 

// ... 

var cb = new ContainerBuilder(); 
cb.RegisterType<DependsByProp1>() 
     .InstancePerLifetimeScope() 
     .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies); 
cb.RegisterType<DependsByProp2>() 
     .InstancePerLifetimeScope() 
     .PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies); 

Property/Property Dependencies

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