私があなたの質問を正しく理解していれば、あなたが望むものを達成する唯一の方法は、ある種の貧乏人の依存性注入によるものだと思います(うん、物議を醸しています-私に反対票を投じないでください!)あなたが話しているさまざまなサブコントロールを構築することは、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;
}
}
次に、いくつかのプロパティを注入したい内側のコントロールでは、次のようにします (注入したいものの例として、古き良き 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; }
}
注: ロガーを使用すると、いくつかの明白な臭いの 1 つが発生します。そのようなコンポーネントをコンテナーにまったく登録しない場合があります (通常は、null ロガーがあります)。そのため、何らかのメカニズムを接続する必要がある場合があります。それが必要かどうかはあなた次第です。