如果我正确理解了您的问题,我认为实现您想要的唯一方法是通过某种穷人的依赖注入(是的,有争议的 - 请不要对我投反对票!)因为 winforms 设计器生成方法的方式构造您所说的各种子控件,这对 IoC 毫无帮助。
我不确定你是否能够进行属性注入,但你可以使用构造函数,这是我刚刚炮制的一个脑筋急转弯的方案......
首先,创建一些方法来访问您的 Windsor 容器——这样的事情可能会奏效:
public static class MyContainer
{
private static readonly IWindsorContainer _container = Bootstrap();
// I did it like this so that there is no explicit dependency
// on Windsor - this would be the only place you need to change
// if you want an alternate container (how much you care about
// that is up to you)
public static T Resolve<T>()
{
return _container.Resolve<T>();
}
private static IWindsorContainer Bootstrap()
{
var container = new WindsorContainer();
container.Install(FromAssembly.This());
// ... whatever else you need to do here
return container;
}
}
其次,在内部控件中,您希望注入一些属性执行类似的操作(我选择了好的 ol' ILogger 作为您可能想要注入的示例):
public partial class MyFancyControl : UserControl
{
// Constructor to keep the winforms designer happy
public MyFancyControl()
: this (MyContainer.Resolve<ILogger>())
{
// Intentionally always blank as this
// is an un-unit-testable method
}
// Constructor that does the actual work
public MyFancyControl(ILogger logger)
{
InitializeComponent();
Logger = logger;
}
public ILogger Logger { get; private set; }
}
注意:使用记录器会引发一些明显的气味之一 - 有时您根本没有向容器注册这样的组件(通常您有一个空记录器),因此您可能需要连接某种机制那个,但如果你需要它,我把它留给你。