【问题标题】:Resolve Castle Windsor dependency by argument name通过参数名称解​​决 Castle Windsor 依赖项
【发布时间】:2026-02-24 14:45:01
【问题描述】:

鉴于此

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

【问题讨论】:

  • 那么你的问题是什么?它不工作吗?你看到了什么?您尝试过什么让它发挥作用?
  • 对不起,我的问题是“如何实现要求”。我现在已经解决了。谢谢
  • 看看Dependency Injection Unity - Conditional Resolving。请注意,此答案适用于任何 DI 容器,而不仅仅是 Unity。还有策略模式herehere 的其他示例。

标签: inversion-of-control castle-windsor ioc-container dependency-inversion


【解决方案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);
    }
}

【讨论】:

  • 可能有一些我还没有探索过的如果和但是。我想我们很快就会发现,除非你们能发现一些明显的东西。
最近更新 更多