Разрешить зависимость Виндзорского замка от имени аргумента

При условии

Component.For<IService>().ImplementedBy<SecretService>().Named("secretService")
Component.For<IService>().ImplementedBy<PublicService>().Named("publicService")

А также

class Foo{
    public Foo(IService publicService){ ...... }
}

А также

class Bar{
    public Bar(IService secretService){ ...... }
}

затем

Foo и Bar должны получать экземпляры publicService и secretService соответственно, полностью основываясь на имени их параметров конструктора.

1 ответ

Решение

Я теперь заставил его работать с использованием пользовательского SubDependencyResolver, я добавил это в контейнер, и теперь он внедряет реализацию по имени

public class ByParameterNameResolver : ISubDependencyResolver
{
    private readonly IKernel kernel;

    public ByParameterNameResolver(IKernel kernel)
    {
        this.kernel = kernel;
    }

    public virtual bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
    {
        if (dependency.TargetItemType == null)
            return false;

        if (string.IsNullOrWhiteSpace(dependency.DependencyKey))
            return false;

        return kernel.HasComponent(dependency.DependencyKey);
    }

    public virtual object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
    {
        return kernel.Resolve(dependency.DependencyKey, dependency.TargetItemType);
    }
}
Другие вопросы по тегам