2011-04-08 7 views
7

मैं एकता 2.0 के साथ ParameterOverride का उपयोग करने का प्रयास कर रहा हूं। यह तब तक ठीक काम करता है जब तक मैं जिस पैरामीटर की आपूर्ति कर रहा हूं वह सिस्टम नहीं है। टाइप करें।पैरामीटर ओवर्राइड सिस्टम पर विफल रहा है। टाइप पैरामीटर

निम्नलिखित परीक्षण कार्यक्रम में, मैं MyClass<T> पर एक पूर्णांक पैरामीटर के साथ कन्स्ट्रक्टर इंजेक्शन कर रहा हूं, जब सामान्य पैरामीटर टी एक int है, और जब टी सिस्टम है तो टाइप पैरामीटर के साथ। टाइप करें। निम्नानुसार आउटपुट में, आप देखेंगे कि यह पूर्णांक को ठीक से संभालता है, लेकिन ऐसा लगता है कि typeof(MyClassForParam) एक वास्तविक MyClassForParam ऑब्जेक्ट है, न कि प्रकार। कोई विचार?

namespace UnityParameterOverride 
{ 
    interface IMyClass 
    { 
    } 

    public class MyClass<T> : IMyClass 
    { 
     public MyClass(T myParam) 
     { 
      Console.WriteLine("{0}", myParam); 
     } 
    } 

    public class MyClassForParam 
    { 
     public MyClassForParam() { } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      IUnityContainer unity = new UnityContainer(); 
      try 
      { 
       // Works fine: prints 12345 
       Console.WriteLine("Injecting an integer parameter."); 
       unity.RegisterType<IMyClass, MyClass<int>>(); 
       unity.Resolve<IMyClass>(new ParameterOverride("myParam", 12345)); 

       // Fails: Seems to think that the parameter is an actual MyClassForParam instead of the type of that class. 
       Console.WriteLine(); 
       Console.WriteLine("Injecting a Type parameter."); 
       unity.RegisterType<IMyClass, MyClass<Type>>(); 
       unity.Resolve<IMyClass>(new ParameterOverride("myParam", typeof(MyClassForParam))); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

आउटपुट इस प्रकार है:

Injecting an integer parameter. 
12345 

Injecting a Type parameter. ---- 
Resolution of the dependency failed, type = "UnityParameterOverride.IMyClass", name = "(none)". 

अपवाद उस समय हुई जब:

Exception occurred while: Resolving parameter "myParam" of constructor UnityParameterOverride.MyClass`1[[System.Type, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]](System.Type myParam). 
Exception is: InvalidCastException - Unable to cast object of type 'UnityParameterOverride.MyClassForParam' to type 'System.Type'. 

अपवाद के समय, कंटेनर था:

Resolving UnityParameterOverride.MyClass1[System.Type],(none) (mapped from Un ityParameterOverride.IMyClass, (none)) Resolving parameter "myParam" of constructor UnityParameterOverride.MyClass1[ [System.Type, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c5 61934e089]](System.Type myParam) 

उत्तर

8

एकता विशेष उपचार देता है पैरामीटर निश्चित टाइप करने के लिए itions। अधिक जानकारी के लिए करज़िस्तोफ Kozmic द्वारा इस पोस्ट देखें: http://kozmic.pl/2008/12/03/unity-framework-and-the-principle-of-the-least-surprise/

+2

** बिल्कुल सही ** उत्तर! वास्तव में, क्रिस्टीज़टॉफ कोज़मिक का सर्विसहोस्ट में टाइप तर्क को इंजेक्शन देने का उदाहरण _exactly_ है जो मैं आईआरएल कर रहा था। – LSpencer777

+1

बस यह पाया क्योंकि मुझे एक ही समस्या थी। ServiceHype में ServiceType इंजेक्ट करने का प्रयास कर रहा है। –

4

मैं मैंने पाया कि आप एक InjectionParameter साथ नग्न प्रकार तर्क लपेटकर द्वारा डिफ़ॉल्ट प्रकार संकल्प व्यवहार को ओवरराइड कर सकते हैं एकता में कुछ spelunking के बाद ही समस्या में भाग:

new ParameterOverride("typeParameterArgument",new InjectionParameter(typeof(Type),typeof(MyNamespace.MyClassUsedAsInjectedTypeArgument))) 

पैरामीटर ओवर्राइड के लिए कन्स्ट्रक्टर इंजेक्शन पैरामीटर वैल्यू। टोपरैमीटर() जो इंजेक्शन पैरामीटर वैल्यू के किसी पूर्वनिर्धारित उप-वर्ग का सम्मान करेगा। प्रॉपर्टीऑवर्राइड का उपयोग करते समय यह विधि भी काम करनी चाहिए जो निर्माण के दौरान एक ही विधि का उपयोग करती है।

+1

उदाहरण के लिए धन्यवाद। यह मेरी सही समस्या हल हो गया! –

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