如何拦截Castle Windsor的组件分辨率以覆盖依赖关系?

时间:2015-05-27 08:41:26

标签: c# dependency-injection inversion-of-control castle-windsor

我正在寻找一种方法来吸引Castle Windsor的解决过程,以便我可以做类似的事情:

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

我希望Castle Windsor能够处理我的大多数依赖项,但我想提供一种“填空”的能力。

我确信这可以做到,但我很难找到例子。

2 个答案:

答案 0 :(得分:3)

您可以使用dependency resolvers来宣告您有一种解决组件的特殊方法。以下是我用于从应用程序设置中解析字符串的示例

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())

答案 1 :(得分:0)

看起来是通过Handler Selector来完成的。