Unity get Type of the service where the dependecy gets injected

旧时模样 提交于 2019-12-12 04:44:45

问题


Is it possible to get, in Unity, the Type of the service where the dependecy gets injected?

In Ninject you can do it like this:

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

How can the same thing be implemented in Unity?

Here is what i have, but i do not have access to any context

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

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

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

回答1:


You have to register your Service (whose type then gets reported to the injected dependency's constructor) with a special InjectionConstructor.

Shamelessly copying my own answer (see 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 );
    }
}


来源:https://stackoverflow.com/questions/47284091/unity-get-type-of-the-service-where-the-dependecy-gets-injected

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!