ウィンザーをかなり長い間使用してきましたが、この「設計」の問題にすぐに遭遇しなかったことに少し驚いています。どうすればいいのかわからない。
ConverterService
データ変換を実行するために使用されるクラスがあります。これはインターフェースです(サンプルを単純化するために、パラメーター/戻り値をオブジェクトに変更しました):-
public interface IConverterService
{
object ConvertData(object sourceData);
}
コンバータークラスには、によって提供されるいくつかの構成設定が必要ISettingsProvider
です。設定は、コンストラクターとConvertData()メソッドの両方で使用されます。したがって、ISettingsProviderをコンストラクターに挿入します。-
public class ConverterService : IConverterService
{
private ISettingsProvider _settingsProvider;
public ConverterService(ISettingsProvider settingsProvider)
{
_settingsProvider = settingsProvider;
// Do some one-time initialisation using info from settingsProvider
// and store the results in class variables (not shown), used by ConvertData.
}
public object ConvertData(object sourceData)
{
// Do the conversion - also uses _settingsProvider,
// and other variables initialised in the constructor ..
}
}
ConverterServiceとSettingsProviderはどちらも、通常の方法でWindsorに登録されます。-
container.Register(Component.For<IConverterService>().ImplementedBy<ConverterService>().LifeStyle.Singleton);
container.Register(Component.For<ISettingsProvider>().ImplementedBy<SettingsProvider>().LifeStyle.Singleton);
コンバーターを使用する必要のあるクラスはすべて、コンストラクター(標準のもの)を介してIConverterServiceを注入します。これは正常に機能しますが、さまざまなコンシューマーがさまざまな設定プロバイダー(最大で2つまたは3つ)でConverterServiceを使用できるようにする必要があります。
毎回初期化のオーバーヘッドが必要ないため、ConverterServiceを一時的にすることはできません。ISettingProviderのタイプごとにConverterServiceの個別のインスタンスが必要なようですが、Windsorを使用してこれを実現できるかどうか、またはどのように実現できるか、またはより基本的なリファクタリングが必要かどうかわかりません。
そして、どのように異なる設定プロバイダーを登録しますか?それらはすべてISettingsProviderを実装しますか?より具体的には、Windsorは正しいものをどのように解決しますか(ConverterServiceコンストラクターは単にISettingsProviderを期待していることを念頭に置いてください)?
クラスを(再)設計する方法についての提案をいただければ幸いです。