2010-05-11 12 views
57

Ben Unity ile daha fazla iş yapmaya başladı. Ben Çözümleyici yöntemi params argüman ResolverOverride sürdüğünü fark etmiş.Birlik 2.0: Nasıl ResolverOverride ile Çöz kullanılır?

Birisi bana ResolverOverride'u nasıl kullanabileceğimi veya daha fazla ipucu alabileceğim başka bir kaynak gösterebileceğim bir örnek verebilir.

cevap

92

bu Bu özellik size sınıfını çözmek zaman anı İmalatcı

  • geçişli parametrelerini izin Unity 2. yeni (ve gerçekten serin özelliği) olduğu fark etmiş gibi. birlik 1'de size yeni InjectionConstructor (...) aracılığıyla türünü kaydederken anda yalnızca bir değer ayarlayabilirsiniz

yoktur ParameterOverride : ResolverOverride

bir adlandırılmış parametreyi geçersiz sağlar

A ResolverOverride sınıfı yapıcısına iletildi. DependencyOverride : ResolverOverride

verilen tipte bir bağımlılığı olduğunda enjekte değeri geçersiz kılar bir sınıfı, bağımlılıklar aynı

  • , bakılmaksızın nesnede görüntülenir nerede grafiktir. PropertyOverride : ResolverOverride

Eğer belirli bir özellik için değerini geçersiz sağlayan bir ResolverOverride sahip mülkler için aynı

  • .

    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; } 
    
        } 
    } 
    

Örnek google bu konuda sessiz kaldığına neden yaptığını hiçbir fikri var.

Alıntılar Birlik kaynak kodu xml dokümanlar gelmektedir. Birisi ilgileniyor Her ihtimale karşı

+1

Harika bir yanıt için teşekkürler. +1 – Vadim

+0

Bu çok yardımcı oldu. Çok iyi açıkladı. –

+1

+1 Mükemmel bir açıklama! –

43

, Okumayı biraz daha kolay ParameterOverride kullanarak çözülmesi için sözdizimi yapar bir uzantısı yöntemi yaptık. Bununla

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 :) 
    } 
} 

aşağıdaki gibi ParameterOverride örneğini yeniden yazabilirsiniz, aşağıdaki gibidir: yöntemdir bu kimse için yararlı olacağını umuyoruz

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

...

+0

parametresini geçersiz kılmalıdır, parametre geçersiz kılma için şık bir şekilde, teşekkür ederim! –

+0

Katılıyorum - bunun için +1 oy. – TravisWhidden

+0

Güzel iş. StackOverflow – Spock

13

Hemen eklemek benim 2c.ParameterOverride'ları şu şekilde ekleyebilirsiniz:

Container.Resolve<IConcreteService>(new ParameterOverrides 
{                     
    {"val", 42} 
}); 
İlgili konular