Dot-Net
Unity 2.0:如何使用 Resolve 和 ResolverOverride?
我開始使用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 文件。