.net Unity 2.0:如何将 Resolve 与 ResolverOverride 一起使用?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2813322/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Unity 2.0: How to use Resolve with ResolverOverride?
提问by Vadim
I started doing more and more work with Unity. I notice that Resolver method takes a paramsargument ResolverOverride.
我开始使用Unity做越来越多的工作。我注意到 Resolver 方法采用params参数ResolverOverride。
Can someone give me an example how I can use ResolverOverrideor point me some other source where I can get more clues.
有人可以给我一个例子,我可以如何使用ResolverOverride或指出我可以获得更多线索的其他来源。
回答by er-v
As you have noticed this is a new (and really cool feature) of the Unity 2. This feature let you
正如您所注意到的,这是 Unity 2 的一个新的(非常酷的功能)。这个功能让您
- pass parameters to constructor in the moment when you resolve the class. In unity 1 you can set only one value in the moment when you register type via new InjectionConstructor(...)
- 在解析类的那一刻将参数传递给构造函数。在 unity 1 中,当您通过 new InjectionConstructor(...) 注册类型时,您只能设置一个值
There is ParameterOverride : ResolverOverride
有 ParameterOverride : ResolverOverride
A ResolverOverride class that lets you override a named parameter passed to a constructor.
一个 ResolverOverride 类,可让您覆盖传递给构造函数的命名参数。
- same for dependencies with
DependencyOverride : ResolverOverride
- 与依赖项相同
DependencyOverride : ResolverOverride
A class that overrides the value injected whenever there is a dependency of the given type, regardless of where it appears in the object graph.
每当存在给定类型的依赖项时覆盖注入的值的类,无论它出现在对象图中的什么位置。
- same for properties with
PropertyOverride : ResolverOverride
- 相同的属性
PropertyOverride : ResolverOverride
A ResolverOverride that lets you override the value for a specified property.
ResolverOverride 可让您覆盖指定属性的值。
Example
例子
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; }
}
}
Have no idea why does Google keeps silent about that.
不知道为什么谷歌对此保持沉默。
Quotes are from Unity source code xml docs.
引用来自 Unity 源代码 xml 文档。
回答by Konamiman
Just in case someone is interested, I have made an extension method that makes the syntax for resolving using ParameterOverridea little easier to read. The method is as follows:
以防万一有人感兴趣,我做了一个扩展方法,使解析 using 的语法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 :)
}
}
With this, you can rewrite the ParameterOverride example as follows:
有了这个,您可以按如下方式重写 ParameterOverride 示例:
var service = container.Resolve<IConcreteService>(new {val=3});
I hope this is useful for someone...
我希望这对某人有用...
回答by Ciaran O'Neill
Just to add my 2c. You can just add a ParameterOverrides like so:
只是为了添加我的2c。您可以像这样添加一个 ParameterOverrides:
Container.Resolve<IConcreteService>(new ParameterOverrides
{
{"val", 42}
});

