Unity 2.0 : ResolverOverride와 함께 Resolve를 사용하는 방법?
Unity로 점점 더 많은 작업을 시작했습니다 . Resolver 메서드가 params 인수 ResolverOverride를 사용 한다는 것을 알았습니다 .
누군가가 ResolverOverride 를 사용하는 방법에 대한 예제를 제공 하거나 더 많은 단서를 얻을 수있는 다른 소스를 알려줄 수 있습니까 ?
아시다시피 이것은 Unity 2의 새롭고 멋진 기능입니다.이 기능을 사용하면
- 클래스를 해결할 때 생성자에 매개 변수를 전달합니다. unity 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 문서에서 가져온 것입니다.
누군가가 관심이있는 경우를 대비하여 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}
});
참고 URL : https://stackoverflow.com/questions/2813322/unity-2-0-how-to-use-resolve-with-resolveroverride
'Program Club' 카테고리의 다른 글
| 선언시 사전에 키 / 값 추가 (0) | 2020.11.20 |
|---|---|
| ASP.NET 페이지에서 JSON 개체 반환 (0) | 2020.11.19 |
| 사후 증가 및 사전 증가 개념? (0) | 2020.11.19 |
| div가 전체 높이를 확장하려면 (0) | 2020.11.19 |
| 내 npm 모듈은 Mac OS X에서 어디에 설치해야합니까? (0) | 2020.11.19 |