2017-03-19 10 views
0

RectangleインターフェイスをSimpleInjectorコンテナに登録するには、同時に​​をベースクラスShapeに注入しますか?Simple InjectorでBaseクラスに依存関係を注入するにはどうすればよいですか?

これを行う目的は、派生クラスが​​に関係しないようにすることです。​​は、デバッグ目的でファイルにいくつかの値を記録するために使用されるインフラストラクチャサービスです。

public class Shape : IShape 
{ 
    public void Shape(ILogger logger){} 
    public virtual void Draw(){} 
} 

public class Rectanble : Shape 
{ 
    public void Reactangular(); 
    public override void Draw(){} 
} 
+1

この質問は現在の状態では不明です。レビューと編集。 – Nkosi

+1

シェイプをログに記録する必要があるのはなぜですか? – Steven

+1

RectangleとShapeは、アプリケーションの実際のオブジェクトと連携しますか?これらのタイプのオブジェクトは、DIコンテナを使用して構築することはほとんどありません。 – Steven

答えて

2

これを実現するには、派生クラスのコンストラクタでロガーを公開する必要があります:

public class Rectangle : Shape 
{ 
    public Rectangle(ILogger logger) : base(logger) { } 
    public override void Draw(){} 
} 

は、ロギングのような横断的関心事を扱うこと基底クラスを注意してください強く示唆していますは、単一責任原則に違反しています。これらの基本クラスは、多くの依存関係を含むクラスを簡単に変更することが容易になり、派生クラスをテストして維持することが難しくなります。

依存関係のある基本クラスを持つ代わりに、通常、デコレータを使用してクロスカッティングの問題を実装する方がはるかに優れています。これにより、基底クラスはきれいに保たれ、しばしば基底クラスを完全に削除することもできます(または純粋に抽象化にすることも、インタフェースで置き換えることもできます)。

関連する問題