2012-03-28 9 views
3

私のPOCOがDIに参加するシナリオはありますか?それはコードのにおいですか?永続オブジェクトと従属注入

+0

[IoCコンテナを使用してエンティティ/ビジネスオブジェクトの依存関係を解決してみませんか?](http://stackoverflow.com/questions/4835046/why-not-use-an-ioc-container-to- resolve-dependencies-for-entities-business-objec) – Steven

答えて

1

コードの匂いは、何かが間違っているかもしれないが必ずしも間違っているとは限りません。私はこれがそのレベルに上昇することは知らない。

顧客POCOと短期間のCustomerValidatorオブジェクトが1人の顧客で操作されたとします。私は重要な依存関係としてxtorインジェクションを使用しています。そして、CustomerValidatorは確かにCustomerに重大な依存関係を取っています。それがなければ理にかなっていません。

私の見積もりでは、これはうまくいくシナリオです。私はそれがPOCOと比較してあなたのオブジェクトの生涯で多くをしなければならないと言うだけでなく、あなたのオブジェクトがPOCOにどれほど批判的に依存しているのでしょうか。

私がコードするとき、これは必ずしも一般的なケースではありません。私はそれを「匂い」と呼ぶことは知らない。おそらくそれがたくさん起こっているなら...とにかく私の2セント。

編集:例えば:

ここ
public class Customer 
{ 
    public virtual string LastName { get; set; } 

    public virtual string FirstName { get; set; } 

    public virtual string Ssn { get; set; } 
} 

public class CustomerValidator 
{ 
    private readonly Customer _customer; 

    public CustomerValidator(Customer customer) 
    { 
     _customer = customer; 
    } 

    public void FixIfNotValid() 
    { 
     if (!IsValid()) 
     { 
      _customer.Ssn = "123456789"; 
      _customer.LastName = "Smith"; 
     } 
    } 

    public bool IsValid() 
    { 
     return !string.IsNullOrEmpty(_customer.Ssn) && !string.IsNullOrEmpty(_customer.LastName); 
    } 
} 

、あなたはPOCO(顧客)とPOCOとPOCOの関係ごとに1つずつ持っているバリデータオブジェクトを持っています。つまり、バリデーターはPOCOをその状態の一部としてカプセル化し、その上で(確かに意図的に)操作を実行します。

POCOがないと、バリデータオブジェクトは意味をなさないので、クライアントにPOCO(コンストラクタ依存性注入)を強制的に与えるような方法でコードを書くことになります。この例の人為的な性質を無視して、これをコードの匂いとは考えません。

依存関係があり、ここに注入しています。後で Customerの継承を定義した場合、バリデータは引き続き作業します。あなたはあなたのPOCOのテスト二倍で代用することによってバリデータをテストすることができます。したがって、DIのさまざまな動機は、サービス指向のクラスを注入する場合と同様に適用されます。だから、個人的に、私は注射しない理由はないと思う。

+0

コード例を挙げられますか? – Greens

+0

あなたはPOCOと言うとき、 "C"はC#を指していますか? –

+0

はい.its C#.... – Greens