统一2.0:如何使用ResolverOverride解决?
我开始在Unity中做更多的工作。 我注意到Resolver方法需要一个参数参数ResolverOverride 。
有人可以给我一个例子,我可以如何使用ResolverOverride或指向我一些其他来源,我可以得到更多的线索。
正如你已经注意到这是一个新的(和真正的酷function)的Unity 2这个function让你
- 在parsing类的时刻将parameter passing给构造函数。 在统一1中,您只能在通过新的InjectionConstructor(…)注册types时设置一个值
有ParameterOverride : ResolverOverride
一个ResolverOverride类,可以让你覆盖传递给构造函数的命名参数。
- 与
DependencyOverride : ResolverOverride
依赖性相同
无论对象图在何处出现,都会覆盖给定types的依赖项时重写的值。
- 与
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; } } }
不知道为什么谷歌保持沉默。
引用来自Unity源代码xml文档。
为了防止有人感兴趣,我做了一个扩展方法,使parsing使用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});
我希望这对某个人有用…
只需要添加我的2c。 你可以像这样添加一个ParameterOverrides:
Container.Resolve<IConcreteService>(new ParameterOverrides { {"val", 42} });