Unity2.0: 如何使用 ResolverOverride 解决方案?

我开始用 团结做越来越多的工作。我注意到 Resolver 方法采用 Params参数 破解程序

有人能给我一个例子,我可以使用 破解程序或指出我一些其他来源,我可以得到更多的线索。

35342 次浏览

正如你所注意到的,这是 Unity 2的一个新特性(非常酷的特性)

  • 将参数传递给构造函数。在第1单元中,当您通过 new InjectionConstruction (...)注册类型时,您只能设置一个值

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


}
}

不知道为什么谷歌对此保持沉默。

引用来自 Unity 源代码 xml 文档。

以防有人感兴趣,我已经创建了一个扩展方法,使用 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 :)
}
}

通过这种方式,您可以按照以下方式重写 Parameter Override 示例:

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

我希望这对某人有用。

只需要添加我的2c。你可以像这样添加一个参数覆盖:

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