2010-05-11 9 views
57

मैंने Unity के साथ अधिक से अधिक काम करना शुरू कर दिया। मुझे पता है कि Resolver विधि पैराम्स तर्क ResolverOverride लेता है।एकता 2.0: ResolverOverride के साथ हल करने का उपयोग कैसे करें?

क्या कोई मुझे उदाहरण दे सकता है कि मैं ResolverOverride का उपयोग कैसे कर सकता हूं या मुझे कुछ अन्य स्रोत बता सकता हूं जहां मुझे और संकेत मिल सकते हैं।

उत्तर

92

आपने गौर किया जैसा कि इस यह सुविधा आपको

  • पास पल में निर्माता के लिए जब आप वर्ग को हल मानकों जाने एकता 2. का एक नया (और वास्तव में शांत सुविधा) है। एकता 1 में आप पल में केवल एक ही मूल्य निर्धारित कर सकते हैं जब आप नए InjectionConstructor (...) के माध्यम से प्रकार दर्ज

है ParameterOverride : ResolverOverride

एक ResolverOverride वर्ग आप नामांकित पैरामीटर को ओवरराइड करने देता है कन्स्ट्रक्टर को पास किया गया।

    निर्भरता के लिए DependencyOverride : ResolverOverride

एक वर्ग है कि मूल्य इंजेक्शन जब भी दिए गए प्रकार का एक निर्भरता है ओवरराइड करता है के साथ

  • ही, जहां यह वस्तु में प्रकट होता है की परवाह किए बिना ग्राफ।

    • संपत्तियों के लिए PropertyOverride : ResolverOverride

    एक ResolverOverride आप एक निर्धारित संपत्ति के लिए मान को ओवरराइड करने देता है साथ

  • ही।

  • उदाहरण

    using System; 
    using Microsoft.Practices.Unity; 
    
    namespace ConsoleApplication1 { 
        class Program { 
         static void Main(string[] args) { 
    
          var container = new UnityContainer(); 
    
          //ParameterOverride example 
    
          container.RegisterType<IConcreteService, ConcreteService>(
           new InjectionConstructor(7) //Old way to pass value to constructor - not flexible. 
                  //All resolved (without ovverride wich aapears only in unity 2.0) classes will hav val=7 
           ); 
    
          var service0 = container.Resolve<IConcreteService>(); 
          Console.WriteLine(service0.Val); //prints 7 
    
          var service = container.Resolve<IConcreteService>(new ParameterOverride("val", 3)); 
          Console.WriteLine(service.Val); // prints 3 
    
          var service2 = container.Resolve<IConcreteService>(new ParameterOverride("val", 5)); 
          Console.WriteLine(service2.Val); // prints 5 
    
          Console.ReadLine(); 
    
          //DependencyOverride example 
    
          var b0 = container.Resolve<B>(new DependencyOverride<IConcreteService>(new ConcreteService(42))); 
          Console.WriteLine(b0.Service.Val); //print 42 
          Console.WriteLine(b0.Service1.Val); //print 42 
    
          var b = container.Resolve<B>(new DependencyOverride<IConcreteService>(new ConcreteService(-42))); 
          Console.WriteLine(b.Service.Val); // print -42 
          Console.WriteLine(b.Service1.Val); // print -42 
    
          Console.ReadLine(); 
    
          //PropertyOverride example 
    
          var b1 = container.Resolve<B>(new PropertyOverride("Service", new ConcreteService(42)), 
           new PropertyOverride("Service1", new ConcreteService(-42))); 
          Console.WriteLine(b1.Service.Val); //print 42 
          Console.WriteLine(b1.Service1.Val); //print -42 
    
          Console.ReadLine(); 
    
    
    
         } 
        } 
    
        public interface IConcreteService { 
         int Val { get; set; } 
        } 
        public class ConcreteService : IConcreteService { 
    
         public int Val { get; set; } 
    
         public ConcreteService(int val) { 
          Val = val; 
         } 
        } 
    
        public class B { 
         [Dependency] 
         public IConcreteService Service{ get; set; } 
    
         [Dependency] 
         public IConcreteService Service1 { get; set; } 
    
        } 
    } 
    

    पता नहीं क्यों गूगल इस बारे में चुप्पी रहती करता है।

    उद्धरण एकता स्रोत कोड xml दस्तावेज़ से हैं।

    +1

    एक शानदार उत्तर के लिए धन्यवाद। +1 – Vadim

    +0

    यह एक बहुत बड़ी मदद थी। बहुत अच्छी तरह से समझाया। –

    +1

    +1 बिल्कुल सही स्पष्टीकरण! –

    43

    बस किसी के इच्छुक होने पर, मैंने एक विस्तार विधि बनाई है जो ParameterOverride का उपयोग करने के लिए थोड़ा आसान पढ़ने के लिए सिंटैक्स बनाता है। विधि इस प्रकार है:

    public static class UnityExtensions 
    { 
        public static T Resolve<T>(this IUnityContainer container, object parameterOverrides) 
        { 
         var properties = parameterOverrides 
          .GetType() 
          .GetProperties(BindingFlags.Public | BindingFlags.Instance); 
         var overridesArray = properties 
          .Select(p => new ParameterOverride(p.Name, p.GetValue(parameterOverrides, null))) 
          .Cast<ResolverOverride>() 
          .ToArray(); 
         return container.Resolve<T>(null, overridesArray); //null needed to avoid a StackOverflow :) 
        } 
    } 
    
    इस के साथ

    , इस प्रकार आप ParameterOverride उदाहरण पुनर्लेखन कर सकते हैं:

    var service = container.Resolve<IConcreteService>(new {val=3}); 
    

    मुझे आशा है कि यह किसी के लिए उपयोगी है ...

    +0

    पैरामीटर ओवरराइडिंग के लिए सुरुचिपूर्ण तरीका लेना चाहिए था, धन्यवाद! –

    +0

    मैं सहमत हूं - इसके लिए +1 वोट दें। – TravisWhidden

    +0

    अच्छा काम। StackOverflow – Spock

    13

    बस जोड़ने के लिए मेरी 2c।आप बस पैरामीटर ओवर्राइड्स को इस प्रकार जोड़ सकते हैं:

    Container.Resolve<IConcreteService>(new ParameterOverrides 
    {                     
        {"val", 42} 
    }); 
    
    संबंधित मुद्दे