2017-03-27 30 views
1

我具有接收在其构造,这通常是创建它的对象的类型,例如另一种类型的一个类型:如何获得在Unity中注入的对象的类型?

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

我想指示统一解决Logger传递作为参数传递给它的构造函数需要它的对象的类型。喜欢的东西:

// ... 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) 
    { 
    } 
} 

这是唯一的概念证明代码,并且可能需要改进之前生产的使用有点...

相关问题