Dot-Net

Unity 2.0:如何使用 Resolve 和 ResolverOverride?

  • May 11, 2010

我開始使用Unity做越來越多的工作。我注意到 Resolver 方法採用params參數ResolverOverride

有人可以給我一個例子,我可以如何使用ResolverOverride或指出我可以獲得更多線索的其他來源。

正如您所注意到的,這是 Unity 2 的一項新功能(而且非常酷)。此功能可讓您

  • 在解析類時將參數傳遞給建構子。在統一 1 中,當您通過 new 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 override which appears only in unity 2.0) classes will have 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; }

   }
}

不知道為什麼Google對此保持沉默。

引用來自 Unity 原始碼 xml 文件。

引用自:https://stackoverflow.com/questions/2813322