2017-11-14 3 views
0

Ist es möglich, in Unity den Typ des Dienstes zu erhalten, in den die Abhängigkeit injiziert wird?Unity get Art des Dienstes, in den die Abhängigkeit injiziert wird

In Ninject können Sie es wie folgt tun:

kernel.Bind<ILogger>().ToMethod((context) => 
{ 
    ILogger logger = HttpContextLoggerFactory.GetInstance(); 

    // Eg: MyApplication.PeopleRepository 
    string memberType = context?.Request?.Target?.Member?.DeclaringType?.FullName; 

    return new LoggerMemberTypeDecorator(logger, memberType); 
}); 

Wie kann die gleiche Sache in Unity umgesetzt werden? Hier

ist das, was ich habe, aber ich habe keinen Zugang zu context

container.RegisterType<ILogger>(new InjectionFactory(u => 
{ 
    ILogger logger = HttpContextLoggerFactory.GetInstance(); 

    // how to get it? 
    string memberType = ""; 

    return new LoggerMemberTypeDecorator(logger, memberType); 
}); 
+0

https://stackoverflow.com/questions/6846342/how-to-inject-log4net-ilog-implementations-using-unity-2 -0 –

+0

Die jeweilige Antwort Es ist nicht anwendbar – Catalin

Antwort

0

Sie haben Ihren Dienst registrieren (dessen Typ dann auf das injizierte Abhängigkeit Konstruktor berichtet wird) mit einem speziellen InjectionConstructor.

Schamlos meine eigene Antwort zu kopieren (siehe Details here):

container.RegisterType<IInterface, Implementation>(new MyInjectionConstructor()); 

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); 
    } 
} 
Verwandte Themen