如何拦截 Castle Windsor 的组件解析以覆盖依赖项?
How do I intercept Castle Windsor's component resolution to override dependencies?
我正在寻找一种方法来连接温莎城堡的解析过程,这样我就可以做类似的事情:
if (componentCanBeResolvedElsewhere)
{
return elsewhere.Resolve<TService>();
}
else
{
windsorContainer.Resolve<TService>();
}
我希望 Castle Windsor 处理我的大部分依赖项,但我想提供 'fill-in the blanks'.
的能力
我确信这可以做到,但我正在努力寻找示例。
看起来你是通过 Handler Selector.
您可以使用 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())
我正在寻找一种方法来连接温莎城堡的解析过程,这样我就可以做类似的事情:
if (componentCanBeResolvedElsewhere)
{
return elsewhere.Resolve<TService>();
}
else
{
windsorContainer.Resolve<TService>();
}
我希望 Castle Windsor 处理我的大部分依赖项,但我想提供 'fill-in the blanks'.
的能力我确信这可以做到,但我正在努力寻找示例。
看起来你是通过 Handler Selector.
您可以使用 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())