统一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} });