按参数名称解析温莎城堡依赖项



鉴于

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的实例,完全基于它们的构造函数参数的名称。

我现在已经使用自定义的 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);
    }
}

最新更新