11

例:基本クラスで依存関係が必要な場合は、基本クラスでProperty Injectionを使用するのが適切ですか?

public abstract class BaseControler : Controller 
{ 
    public IUnitOfWork UnitOfWork { get; set; } 
} 

public class HomeController : BaseControler 
{ 
    readonly IUserRepository _userRepository; 

    // :-) 
    public HomeController(IUserRepository userRepository) 
    { 
     _userRepository = userRepository; 
    } 
} 

我々はすべて私たちは依存性が必要ときコンストラクタ・インジェクションを使用する必要があることを知っています。 オプションの場合は、依存関係プロパティ注入を使用することができます。

しかし、あなたの基本クラスだけが依存関係を必要とする場合はどうしますか?

コンストラクタインジェクションを使用すると、私の意見ではすべての派生クラスが汚染されます。

public abstract class BaseControler : Controller 
{ 
    readonly IUnitOfWork _unitOfWork; 

    public BaseControler(IUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    } 
} 

public class HomeController : BaseControler 
{ 
    readonly IUserRepository _userRepository; 

    // :-(
    public HomeController(IUserRepository userRepository, 
     IUnitOfWork unitOfWork) : base(unitOfWork) 
    { 
     _userRepository = userRepository; 
    } 
} 

は、それが依存関係が唯一のベースクラスで必要とされている場合、基本クラスでプロパティインジェクションを使用するapproperiateですか?

答えて

12

派生クラスは汚染されていません。このクラスがこの依存関係なしで機能できないことを明示的に消費者に伝えています。

正常に機能するために基本クラスがこの依存関係を必要とする場合、派生クラスはこの基本クラスから派生するため、この依存関係も暗黙的に必要です。したがって、2番目の例は正しい方法です。必要な依存関係にプロパティインジェクションを使用すべきではありません。

+0

私はあなたの要点を見ていますが、私が得る問題は多くのコンストラクタパラメータです。要点は、派生したクラスが基本クラスの代わりに依存関係に直接話していないことです。だから私は依存関係への直接呼び出しと依存関係への間接呼び出しを区別します。 – Rookian

+0

@Rookian、複数のコンストラクタパラメータを持つ状況になった場合、それらの依存関係を集約してサービスのみをコンストラクタに挿入するサービスの作成を検討することがあります。 –

+5

+1継承を超えて合成を優先します。あまりにも多くのコンストラクタパラメータで問題になる場合は、コンストラクタインジェクションではなく、継承ストラテジを責めます。 –

3

実際には、派生クラスは基本クラスです。どこか別のオブジェクトはありません。ベースコンストラクタに何かを渡すと、実際には同じオブジェクトが初期化されます。

1つのインスタンスがあります。これは、ユーザーリポジトリと作業ユニットの2つに依存します。基本クラスコンストラクタへの呼び出しは、派生クラスから初期化複製を削除するだけです。