2009-11-17 12 views
6

लंबे समय तक पाठक पहली बार लेखक। मैं वर्तमान में एक सरल सी # .NET अनुप्रयोग के लिए कैसल विंडसर की वर्तमान रिलीज के लिए निनजेक्ट के उपयोग से रूपांतरण कर रहा हूं।कैसल विंडसर: एकाधिक रचनाकारों के साथ समस्या

अधिकांश भाग के लिए, रूपांतरण अच्छी तरह से चला गया है और कंटेनरों के कार्यान्वयन ने निष्पक्षता से निष्पादित किया है। हालांकि मुझे अपने भंडार वस्तुओं के साथ एक छोटा सा मुद्दा है।

public class UserRepository : IUserRepository { 
    public UserRepository(IObjectContext objectContext) { 
     // Check that the supplied arguments are valid. 
     Validate.Arguments.IsNotNull(objectContext, "objectContext"); 

     // Initialize the local fields. 
     ObjectContext = objectContext; 
    } 

    public UserRepository(IObjectContextFactory factory) 
     : this(factory.CreateObjectContext()) { 
    } 

    // ----------------------------------------------- 
    // Insert methods and properties... 
    // ----------------------------------------------- 
} 

इस कोड के अनुरूप करने के लिए, मैं सेटअप अपने आवेदन के विन्यास फाइल में निम्नलिखित प्रविष्टियों:

<castle> 
    <components> 
     <component id="objectContextFactory" lifestyle="custom" 
        customLifestyleType="Common.Infrastructure.PerWebRequestLifestyleManager, Common.Castle" 
        service="Project.DAL.Context.IObjectContextFactory, Project.DAL.LINQ" 
        type="project.DAL.Context.ObjectContextFactory, Project.DAL.LINQ"> 
     </component> 
     <component id="userRepository" lifestyle="custom" 
        customLifestyleType="Common.Infrastructure.PerWebRequestLifestyleManager, Common.Castle" 
        service="Project.BL.Repository.IUserRepository, Project.BL" 
        type="Project.BL.Repository.UserRepository, Project.BL.LINQ"> 
      <parameters> 
       <factory>${objectContextFactory}</factory> 
      </parameters> 
     </component> 
    </components> 
</castle> 

मैं एक उपयोगकर्ता भंडार उद्देश्य यह है कि निम्नलिखित फैशन में कोडित है है मेरे लिए, सब कुछ ऐसा दिखता है। जब मैं IObjectContextFactory सेवा के उदाहरण को हल करने का प्रयास करता हूं, तो मैं ऑब्जेक्ट कॉन्टेक्स्ट फ़ैक्टरी ऑब्जेक्ट पुनर्प्राप्त करता हूं। मेरी समस्या तब आती है जब मैं IUserRepository सेवा के उदाहरण को हल और हल करता हूं। मुझे निम्नलिखित आनंददायक अपवाद के साथ इलाज किया जाता है:

घटक 'उपयोगकर्ता रिपोजिटरी' नहीं बना सकता क्योंकि इसकी निर्भरता संतुष्ट होने के लिए है। UserRepository निम्नलिखित निर्भरता के लिए इंतज़ार कर रहा है:

सेवाएं:

- SandCastle.DAL.Context.IObjectContext which was not registered.

मैं सब कुछ मैं इस पर सोच सकते हैं की कोशिश की है। तो, आप स्टैक ओवरफ्लो पाठकों के लिए, मैं कहता हूं: कोई विचार मिला?

उत्तर

7

इसे एक बग के रूप में माना जा सकता है (और वास्तव में इस तरह के मामलों के लिए यह ठीक करने योग्य है) लेकिन यह एक डिज़ाइन सुविधा है।

विंडसर लालची कन्स्ट्रक्टर (सबसे अधिक पैरामीटर वाले एक) से मेल खाता है जो इसे संतुष्ट कर सकता है।

हालांकि आपके मामले में, दो रचनाकार हैं जिनमें सबसे अधिक पैरामीटर (एक का) है, इसलिए विंडसर बस पहले चुनता है, जहां "पहला" मतलब अनिर्धारित है।

वास्तव में यदि आप अपने स्रोत कोड में अपने रचनाकारों का क्रम स्विच करते हैं तो आपका कोड काम करना शुरू कर देगा, हालांकि यह एक हैक है, जो अनियंत्रित व्यवहार पर निर्भर है और ऐसा नहीं करता है।

चलो वापस जाएं जहां हमने शुरू किया था?

मैंने कहा कि विंडसर उलझन में है क्योंकि एकल लालची कन्स्ट्रक्टर यह संतुष्ट कर सकता है।

public class UserRepository : IUserRepository { 
    public UserRepository(IObjectContext objectContext, object fakeIgnoreMe) { 
     // Check that the supplied arguments are valid. 
     Validate.Arguments.IsNotNull(objectContext, "objectContext"); 
     // ignoring fake additional argument 
     // Initialize the local fields. 
     ObjectContext = objectContext; 
    } 

    public UserRepository(IObjectContextFactory factory) 
     : this(factory.CreateObjectContext()) { 
    } 

    // ----------------------------------------------- 
    // Insert methods and properties... 
    // ----------------------------------------------- 
} 

इतना है कि यह होगा Castle users list या straight to issue tracker को इस मामले की रिपोर्ट करें:

त्वरित और अच्छी तरह से परिभाषित ठीक वें कंस्ट्रक्टर्स से एक के लिए एक नकली पैरामीटर जोड़ने का इतना है कि वे मानकों की विभिन्न संख्या है किया जाएगा तय हो जाओ

+0

gangbusters की तरह काम किया! धन्यवाद! – highvoltage

+2

"विंडसर लालची कन्स्ट्रक्टर से मेल खाता है (सबसे अधिक पैरामीटर जो इसे संतुष्ट कर सकता है)"। मुझे लगता है कि यह कहने के लिए और अधिक सही है कि "रचनाकारों की सूची से केवल संकल्पनीय पैरामीटर होते हैं, अधिकांश पैरामीटर वाले कन्स्ट्रक्टर को चुना जाता है"। – Steven

+0

@Steven अब के बारे में कैसे? –

0

विंडसर 3.2 के रूप में।एक्स

यदि गुण Castle.Core.DoNotSelectAttribute किसी कन्स्ट्रक्टर पर लागू होता है, तो यह किसी अन्य मानदंड के बावजूद नहीं चुना जाएगा।

public class UserRepository : IUserRepository 
{ 
    [DoNotSelect] // This constructor will be ignored by Windsor 
    public UserRepository(IObjectContext objectContext) 
    { 
     // ... 
    } 

    public UserRepository(IObjectContextFactory factory) 
     : this(factory.CreateObjectContext()) {} 
} 

संदर्भ: https://github.com/castleproject/Windsor/blob/86696989a7698c45b992eb6e7a67b765b48108b0/docs/how-constructor-is-selected.md

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