2012-03-09 4 views
1

私はクラスにDIを実装しようとしていますが、自分の設計が適切であるとは確信していません。DIを特定の状況で実装する

私はちょうど私がこのような状況でDIを実装する方法を取得しない

public partial class Doer 
{ 
    private static readonly DoerRepository repository = new DoerRepository(); 

    public static IEnumerable<Doer> GetActiveDoers() 
    { 
     return repository.Doers.Where(c => c.Person.IsActive); 
    } 
} 

私は

class DoerValidation 
{ 
    public DoerValidation() 
    { 
     compileData(); 
    } 

    private void compileData() 
    { 
     doersActive = Doer.GetActiveDoers(); 
     //... 
    } 
} 

にDIを追加したいクラスのそして、私のDoerクラスのreleventコード。たぶんGetActiveDoers方法が悪い設計ですか?そうでない場合は、どこにこのメソッドを配置しますか?

新しいメソッドをリポジトリに直接追加することをお勧めしますか?コンストラクタに渡し - 一部の人々は、それはあなたが基本的にDoerValidationDoerRepositoryを注入する必要があるようですねこれだけ

public interface IDoerRepository 
{ 
    IQueryable<Doer> Doers { get; } 
    void SaveDoer(Doer doer); 
    void DeleteDoer(Doer doer); 
} 

答えて

2

を実装して、それはきれいに滞在する必要が私に言いました。

GetActiveDoersと静的変数の両方は、DI、IMOの原則に反します。

+0

ありがとうございます。この場合の原則については少し説明してください。 – Mathieu

+0

+1「DIの原則」もっと同意できませんでした。 –

+1

@Mathieu: 'DoerValidation'は' DoerRepository'に効果的です。それをコンストラクタに渡して注入します。 'GetActiveDoers'をインスタンスメソッドとして' DoerRepository'自体に置きます。そうしなければならない場合は、拡張メソッドにすることもできます。 –

1

静的メソッドおよびプロパティは、性質上手続き型です。静的にGetActiveDoers()メソッドを公開すると、その機能を注入する方法がありません。クライアントは必要な場合にのみ無視するか、インラインで使用できます。

DIと静的な実装にコミットしている場合は、その静的なクラスのインスタンスラッパーを作成し、インスタンスラッパーを挿入する必要があります。