2017-03-27 3 views
1

내가 예를 들어, 보통을 생성하는 객체의 유형입니다 생성자, 다른 유형을받는 유형이 :Unity에서 주입되는 객체의 유형을 얻는 방법은 무엇입니까?

public class Logger { 
    public Logger(Type parent) { ... } 
} 

나는에 인수로 전달 Logger를 해결하기 위해 단결을 지시하고 싶은 그 constructor 요구하는 오브젝트의 형태 같은 뭔가 :

// ... would be some directive to tell Unity to use the type that 
/// depends on Logger 
container.RegisterType<Logger>(new InjectionConstructor(...)); 

내가 MyService를 해결하려고 할 때 그래서 :

public MyService { 
    public MyService(Logger logger) { ... } 
} 

가 반환합니다 가능

var logger = new Logger(typeof(MyService)); 
return new MyService(logger); 

인가? 그것을하는 또 다른 방법이 있습니까? 사실

답변

0

, 당신은이 작업을 수행 할 수 있습니다 ...

internal class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<IInterface, Implementation>(new MyInjectionConstructor()); 

     // this instance will get a logger constructed with loggedType == typeof(Implementation) 
     var instance = container.Resolve<IInterface>(); 
    } 
} 

internal class MyInjectionConstructor : InjectionMember 
{ 
    public override void AddPolicies(Type serviceType, Type implementationType, string name, IPolicyList policies) 
    { 
     policies.Set<IConstructorSelectorPolicy>(new MyConstructorSelectorPolicy(), new NamedTypeBuildKey(implementationType, name)); 
    } 
} 

internal class MyConstructorSelectorPolicy : DefaultUnityConstructorSelectorPolicy 
{ 
    protected override IDependencyResolverPolicy CreateResolver(ParameterInfo parameter) 
    { 
     if(parameter.ParameterType == typeof(ILogger)) 
     { 
      return new LiteralValueDependencyResolverPolicy(new Logger(parameter.Member.DeclaringType)); 
     } 
     return base.CreateResolver(parameter); 
    } 
} 

internal interface ILogger 
{ 
} 

internal class Logger : ILogger 
{ 
    public Logger(Type loggedType) 
    { 
    } 
} 

internal interface IInterface 
{ 
} 

internal class Implementation : IInterface 
{ 
    public Implementation(ILogger logger) 
    { 
    } 
} 

이는 개념 증명 코드이며, 생산 사용하기 전에 조금 정제해야 할 수도 있습니다

관련 문제