2010-04-19 6 views
5

निनजेक्स कन्स्ट्रक्टर आर्ग्यूमेंट का उपयोग करते समय आप विशिष्ट मानकों को इंजेक्ट करने के लिए सटीक मान निर्दिष्ट कर सकते हैं। यह मान शून्य क्यों नहीं हो सकता है, या मैं इसे कैसे काम कर सकता हूं? हो सकता है कि यह कुछ आप क्या करना चाहते हैं नहीं है, लेकिन मैं अपने इकाई परीक्षण में उपयोग करना चाहते हैं .. उदाहरण:मैं निनजेक्स कन्स्ट्रक्टर आर्ग्यूमेंट के साथ मूल्य शून्य क्यों नहीं लगा सकता?

public class Ninja 
{ 
    private readonly IWeapon _weapon; 
    public Ninja(IWeapon weapon) 
    { 
     _weapon = weapon; 
    } 
} 

public void SomeFunction() 
{ 
    var kernel = new StandardKernel(); 
    var ninja = kernel.Get<Ninja>(new ConstructorArgument("weapon", null)); 
} 
+0

मैं निंजा से परिचित नहीं हूं, लेकिन मुझे लगता है कि मुद्दा यह है कि आईओसी-कंटेनर एक उपयुक्त कन्स्ट्रक्टर खोजने के लिए प्रकार की जानकारी का उपयोग करता है और इसे शून्य मान से नहीं मिल सकता है। आप दस्तावेज़ में या उसके कोड में उत्तर खोजना बेहतर होगा। एक लाइब्रेरी में जिसे मैंने इसी प्रकार के ऑब्जेक्ट का उदाहरण इस्तेमाल किया है, उसे शून्य के बजाय पास किया जाना है। यहां कुछ समान समाधान भी हो सकते हैं। – SergGr

+0

धन्यवाद सर :-) – stiank81

उत्तर

7

स्रोत (और स्टैक ट्रेस मैं reproing से मिला जो आप छोड़े गए: पी) को देखते हुए

इसका कारण यह है कि यह (यानी, जहां 'सामान्य उपयोग से ConstructorArgument ctor का एक अलग अधिभार के लिए बाध्य कर रहा है एक मूल्य प्रकार या एक गैर-शून्य संदर्भ प्रकार गुजर रहा है) करता है।

वैकल्पिक हल अशक्त कास्ट करने के लिए वस्तु के लिए है: -

var ninja = kernel.Get<Ninja>(new ConstructorArgument("weapon", (object)null)); 

Ninject 2 स्रोत:

public class ConstructorArgument : Parameter 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="ConstructorArgument"/> class. 
    /// </summary> 
    /// <param name="name">The name of the argument to override.</param> 
    /// <param name="value">The value to inject into the property.</param> 
    public ConstructorArgument(string name, object value) : base(name, value, false) { } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="ConstructorArgument"/> class. 
    /// </summary> 
    /// <param name="name">The name of the argument to override.</param> 
    /// <param name="valueCallback">The callback to invoke to get the value that should be injected.</param> 
    public ConstructorArgument(string name, Func<IContext, object> valueCallback) : base(name, valueCallback, false) { } 
} 

रेप्रो:

public class ReproAndResolution 
{ 
    public interface IWeapon 
    { 
    } 

    public class Ninja 
    { 
     private readonly IWeapon _weapon; 
     public Ninja(IWeapon weapon) 
     { 
      _weapon = weapon; 
     } 
    } 

    [Fact] 
    public void TestMethod() 
    { 
     var kernel = new StandardKernel(); 
     var ninja = kernel.Get<Ninja>(new ConstructorArgument("weapon", (object)null)); 
    } 
} 

सबक? आप पागल हो जाएंगे कि नवीनतम स्रोत डाउनलोड न करें और इसे देखें। महान टिप्पणियां, अच्छी साफ कोडबेस। उस टिप/प्रोडिंग के लिए @ इयान डेविस को फिर से धन्यवाद!

+0

+1 अच्छा - दिलचस्प सामान। स्पष्टीकरण के लिए – Finglas

+0

Thx। ऐसा मत सोचो कि मैं ऑब्जेक्ट्स को कास्टिंग नल के आसपास जाना चाहता हूं, लेकिन ऐसा लगता है कि मेरे सवाल का जवाब है! शायद मुझे नवीनतम स्रोत की जांच करनी होगी :-) – stiank81

+0

@ stiank81: @ फ़िंगलास के उत्तर पर मेरी टिप्पणी के रूप में (जो मुझे विश्वास है कि सही जवाब है, भले ही मैं सहमत हूं कि यह स्वीकार किया जाना चाहिए: पी) कहता है, इसका कारण बदसूरत है ऐसा इसलिए है क्योंकि इसका सामान्य उपयोग में नहीं किया जाना चाहिए (क्या हमने किसी अन्य प्रश्न में कन्स्ट्रक्टर आर्ग्यूमेंट को खराब डिफ़ॉल्ट दृष्टिकोण नहीं दिया है?: पी) @ फ़िंगलास: धन्यवाद, और अन्य सामग्री को हटाने के लिए धन्यवाद –

0

यह शायद असमर्थित क्योंकि निर्माता तर्क मूल्य प्रकार भी हो सकता है।

+0

इससे मुझे वास्तविक जवाब खोजने के लिए प्रेरित किया गया क्योंकि यह गलत महसूस हुआ। लेकिन इसने मुझे ब्रायन के जवाब से असहमत होने के प्रति प्रतिबिंब पर भी प्रेरित किया (मैं दोनों को छोड़कर +0 छोड़ दूंगा, लेकिन दूसरे को पूर्ववत करने के लिए बहुत देर हो चुकी थी और दोनों ने वैचारिक अंतर्दृष्टि प्रदान की, मुझे विश्वास नहीं है कि वे कुछ भी प्रतिनिधित्व करते हैं जो निनजेक्ट प्रोत्साहित करने/रोकने/बल) –

3

मुझे निनजेक्ट नहीं पता है, लेकिन AFAIK कन्स्ट्रक्टर इंजेक्शन आमतौर पर अनिवार्य निर्भरताओं के लिए उपयोग किया जाता है और इस प्रकार इस संदर्भ में शून्य कम समझ में आता है। यदि निर्भरता अनिवार्य नहीं है तो प्रकार को एक डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान करना चाहिए और इसके बजाय संपत्ति इंजेक्शन का उपयोग करना चाहिए।

This post अतिरिक्त जानकारी प्रदान करता है।

+0

मैं इसे +1 करता हूं क्योंकि यह गेरी के जवाब से अधिक तार्किक लग रहा था।प्रतिबिंब पर मैं वास्तव में सहमत नहीं हूं क्योंकि इसका उपयोग मूल्य प्रकारों के साथ-साथ संदर्भ प्रकारों के लिए भी किया जा सकता है और बिंदु वास्तव में उस संदर्भ में अच्छी तरह से सामान्यीकृत नहीं करता है। जो कोई भी रक्षा करना चाहता है वह अनिर्दिष्ट, यादृच्छिक रूप से अनियंत्रित और/या निर्भरता है जो स्पष्ट रूप से निर्दिष्ट नहीं हैं कि उपकरण निर्भरता श्रृंखलाओं की पहचान करने में आपकी सहायता कर सकते हैं। –

+0

संपत्ति इंजेक्शन इस के लिए एक स्वीकार्य समाधान है? यदि ऐसा है तो यह करने के लिए एक उचित चीज की तरह लगता है। लिंक के लिए Thx। – stiank81

+0

@ stiank81: जबकि संपत्ति इंजेक्शन उस मूलभूत चीज़ को पूरा कर सकता है जिसे आप प्राप्त करने की कोशिश कर रहे हैं (बहुत सारे 'शून्य' मान), ऐसा करने में आप कोड स्वच्छता में बहुत कुछ खो देंगे, इसलिए मैं नहीं कहूंगा- I आपको @ फ़िंगलास के उत्तर में देखें। –

3

मैं अपने इकाई में इसका उपयोग करना चाहते परीक्षण

वहाँ no need to use an IOC container for unit tests है। आपको कंटेनर का उपयोग रनटाइम पर एक साथ अपने डिवाइस को तार करने के लिए करना चाहिए, और कुछ और नहीं। और यदि चोट करने के लिए शुरू होता है, इसकी एक गंध अपने वर्ग का संकेत हाथ से बाहर हो रही है

आपका इकाई परीक्षण तो इस उदाहरण में होगा (SRP उल्लंघन?):

var ninja = new Ninja(null); 

से ऊपर है कानूनी सी # कोड , और यूनिट परीक्षण के लिए एक शून्य संदर्भ पास करना यूनिट परीक्षण क्षेत्रों का एक बिल्कुल मान्य तरीका है जिसे निर्भरता की आवश्यकता नहीं है।

+0

+1 महत्वपूर्ण बिंदु भले ही यह उत्तर न दे सवाल (हालांकि तथ्य यह है कि यह मामला शायद यह मुद्दा क्यों है ('शून्य' के मामले में गलत अधिभार को हल करने के लिए) को कोई मुद्दा नहीं माना गया है। –

+0

@ रूबेन: यह ठीक है, इसके अलावा एसओ क्या है सुधार और सीखना। – Finglas

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