私は、Configurator
その仕事をするためにContext
、インターフェースを介してオブジェクトを受け取る必要があるクラスを持っています:
public class Configurator : IContextAware
{
private IContext _context;
//property setter defined by the IContextAware interface
public IContext Context { set { _context = value; } }
// use _context object in other methods here ...
}
私は、フィールドを同じ方法でConfigurator
初期化する必要がある多くの型を書く予定です。_context
私が最初に考えたのは、「インターネット上のすべてのプログラマーを怒らせて、継承を使用してみませんか?」ということでした。
public class ContextInitializer: IContextAware
{
// field to hold the injected context
protected IContext _context;
//property setter defined by the IContextAware interface
public IContext Context { set { _context = value; } }
}
public class Configurator : ContextInitializer
{
// use _context object here ...
}
このように、Context オブジェクトを必要とする私が作成した他のクラスは、ContextInitializer から継承するだけで、Context オブジェクトをすぐに使用できます。
長所: 一貫した初期化が保証され、気を散らさず、すべてのクラスで初期化コードが重複していない
短所: 実装の継承は悪です!..ええと、Configurator は他のどのクラスからも継承できません..??
いずれにせよ、Configurator はIContextAware
インターフェイスを実装する必要があることを明確にする必要があります。また、クラスにはデフォルト/引数なしのコンストラクターが必要であるため、コンストラクター依存性注入はここではオプションではありません。
同じ利点を達成するために合成を使用する方法を誰かが提案できますが、より柔軟な設計で、および/または上記の継承ソリューションの実際の欠点を説明できますか? ありがとう!
PS これは、Spring.Net CodeConfig から採用されたものです。