我如何拦截Castle windsor的组件解析来覆盖依赖关系?

本文关键字:覆盖 依赖 关系 组件 何拦截 Castle windsor | 更新日期: 2023-09-27 17:50:53

我正在寻找一种方法来挂钩温莎城堡的决议过程,这样我就可以做一些事情,如:

if (componentCanBeResolvedElsewhere)
{
    return elsewhere.Resolve<TService>();
}
else
{
    windsorContainer.Resolve<TService>();
}

我想让Castle Windsor处理我的大部分依赖项,但我想提供一种"填补空白"的能力。

我相信这是可以做到的,但我正在努力寻找例子。

我如何拦截Castle windsor的组件解析来覆盖依赖关系?

您可以使用依赖解析器,它允许您声明您有一种特殊的解决组件的方法。下面是我用来解析应用程序设置

中的字符串的示例
public class AppSettingsResolver : ISubDependencyResolver
{
    public bool CanResolve(
                CreationContext context,
                ISubDependencyResolver contextHandlerResolver,
                ComponentModel model,
                DependencyModel dependency)
    {
        return !string.IsNullOrEmpty(ConfigurationManager.AppSettings[dependency.DependencyKey])
               &&
               TypeDescriptor.GetConverter(dependency.TargetType)
                .CanConvertFrom(typeof(string));
    }
    public object Resolve(
                    CreationContext context,
                    ISubDependencyResolver contextHandlerResolver,
                    ComponentModel model,
                    DependencyModel dependency)
    {
        return TypeDescriptor
            .GetConverter(dependency.TargetType)
            .ConvertFrom(ConfigurationManager.AppSettings[dependency.DependencyKey]);
    }
}

然后在城堡容器中注册解析器:

container.Kernel.Resolver.AddSubResolver(new AppSettingsResolver())

看起来是通过Handler选择器来完成的。