我正在寻找一种方法来吸引Castle Windsor的解决过程,以便我可以做类似的事情:
if (componentCanBeResolvedElsewhere)
{
return elsewhere.Resolve<TService>();
}
else
{
windsorContainer.Resolve<TService>();
}
我希望Castle Windsor能够处理我的大多数依赖项,但我想提供一种“填空”的能力。
我确信这可以做到,但我很难找到例子。
答案 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来完成的。