我找到了一个我认为应该这样做的解决方案。在温莎的内部DefaultDependencyResolver
有一个方法用于解决子依赖关系(例如装饰实例IRecorder
上面)称为RebuildContextForParameter。它调用它来创建一个新的上下文,以便在解析依赖项时使用(即构造函数的参数)。方法是:
/// <summary>This method rebuild the context for the parameter type. Naive implementation.</summary>
protected virtual CreationContext RebuildContextForParameter(CreationContext current, Type parameterType)
{
if (parameterType.ContainsGenericParameters)
{
return current;
}
return new CreationContext(parameterType, current, false);
}
The false
参数输入CreationContext
构造函数是propagateInlineDependencies
,当 true 时将复制current
上下文的AdditionalArguments
,从而将参数传递给子依赖项。
要翻转这个false
to true
,创建一个派生自的新类DefaultDependencyResolver
:
public class DefaultDependencyResolverInheritContext : DefaultDependencyResolver
{
protected override CreationContext RebuildContextForParameter(CreationContext current, Type parameterType)
{
if (parameterType.ContainsGenericParameters)
{
return current;
}
return new CreationContext(parameterType, current, true);
}
}
然后在创建 Windsor 容器时使用它:
var kernel = new DefaultKernel(
new DefaultDependencyResolverInheritContext(),
new NotSupportedProxyFactory());
var container = new WindsorContainer(kernel, new DefaultComponentInstaller());
The NotSupportedProxyFactory
and DefaultComponentInstaller
是使用无参数构造函数时的默认值DefaultKernel
and WindsorContainer
.
完成后,当使用工厂创建一个工厂时,上面的代码将起作用IRecorder
, i.e.:
// during type registration/bootstrapping
container.AddFacility<TypedFactoryFacility>();
container.Register(Component.For<IRecorder>().ImplementedBy<NotifyingRecorder>());
container.Register(Component.For<IRecorder>().ImplementedBy<ModelUpdatingRecorder>());
container.Register(Component.For<IRecorderFactory>().AsFactory());
Where IRecorderFactory
is:
public interface IRecorderFactory
{
IRecorder Create(int seed);
}
然后这将按预期工作:
IRecorderFactory recorderFactory = container.Resolve<IRecorderFactory>();
IRecorder recorder = recorderFactory.Create(20);
recorder.Add(6);
希望这对其他人有帮助!