2009-09-01 60 views
8

私はこの問題に取り組む方法を理解しようとしています。私は2つのテーブルにいくつかのデータを挿入する必要が今の私の最初の質問は、別のリポジトリが別のリポジトリを呼び出す必要がありましたリポジトリは別のリポジトリを呼び出す必要がありますか?あるいは、リポジトリがサービス層を呼び出す必要がありますか?

Table A has these columns 
AId<PK> 
A1 
A2 
A3 

Table B has 
AId<PK> 
A1 
B2 
B3 
B4 

表Aと表Bそれらを呼び出すことができますか?私はこれが私の現在の問題を解決するとは思わないが、私は将来の参照のためにこれを知りたいのですか?

今、私の問題に。

私が私のリポジトリ層(TableARepitory)を作成してテーブルを作成するときに、私はすぐにtableBのフィールドも作成します。

// linq to sql. 
    TableA myATable = new TableA(); 
    dbContext.myATable.A1 = "hi"; // all these values would come from parameters. 
    dbContext.myATable.A2 = "bye"; 
    dbContext.myATable.A3 = "go"; 

    dbContext.myATable.insertOnSubmit(TableA); 
    dbContext.SubmitChanges(); 

    TableB myBTable = new TableB(); 
    dbContext.myBTable.AId = myATable.AId; 
    dbContext.myBTable.A1 = myATable.A1; 
    dbContext.myBTable.B2 = "2"; 
    dbContext.myBTable.B3 = "3"; 
    dbContext.myBTable.B4 = "4"; 

    dbContext.myATable.insertOnSubmit(TableB); 
    dbContext.SubmitChanges(); 

だから私は、これは大丈夫だと思うし、私はこのまたはサービス層のための(TABLEBを作成する)myBTableリポジトリを呼び出す必要があるだろうとは思いません。

ここに問題があります。 TableBテーブルは、「hi」と等しくない場合に限り、このテーブルに情報を挿入する必要があります。

so param1 != "hi" // insert 
    param1 == "hi" // ignore and only insert table A 

ので、これは私は、これはほとんどのビジネス・ロジックのように思えるので、今、私はここにこれを実行すべきかわからないこの

if(param1 != "hi") 
{ 
    TableB myBTable = new TableB(); 
    dbContext.myBTable.AId = myATable.AId; 
    dbContext.myBTable.A1 = myATable.A1; 
    dbContext.myBTable.B2 = "2"; 
    dbContext.myBTable.B3 = "3"; 
    dbContext.myBTable.B4 = "4"; 

    dbContext.myATable.insertOnSubmit(TableB); 
    dbContext.SubmitChanges(); 
} 

ように私TableBのをラップする必要がありますを意味します。しかし、同時に私はこのビジネスロジックをどうやって行うかわからないので、どちらかの方法で、たとえnullであってもcreateメソッドに挿入する必要があります(A1はnull許容フィールドです)。

TableA.Id、A1にtableBサービス層を渡し、A1が何であるかを確認する必要があります。良い場合は、TableBリポジトリに移動してその方法で挿入しますか?

だからTableArepostory - > TableBサービス層 - > TableBRepository(その値!= "hi"が見つかった場合)。

私は何をすべきか分かりません。

答えて

10

いいえ - リポジトリが別のリポジトリや別のサービスを呼び出す理由を考えることはできません。彼らの唯一の懸念事項は、エンティティを永続させ、データストアからエンティティを取得することです。彼らは、基礎となるドメインを除いて、アプリケーションのほとんどの側面に無知でなければなりません。

テーブルごとにリポジトリにする必要があると思われますが、これは間違っています。集約ルートごとにリポジトリが存在する必要があり、そのリポジトリは基礎となるすべての関連テーブルにデータを格納する必要があります。リポジトリには、データの保存場所や方法に関するロジックがあることは間違いありませんが、可能な場合は共通の領域にカプセル化することをお勧めします。

たとえば、personオブジェクトを持ち、性別によって異なるテーブルに保存する必要があった場合は、継承(ここでは(人)がここに保存されている場合)...またはオブジェクトのプロパティ(if (person.Gender == Gender.Female)ここに保存...)または仕様(if(FemaleSpecification.IsSatisfiedBy(人))ここで保存...)。

+0

私はいつも私が見たすべての例が非常に小さいので、テーブルあたりのリポジトリを作ったように思っていました。私は今、私は未来を知っていると思う。私はそれを修正するためにすべてを減らすつもりはないので、私はそれの中に少しの論理を持っていなければならないと思う。とにかく今はありません。 – chobo2

1

ガード句(param1!= "hi")は、アプリケーションサービス層などの上位層にある必要があります。

サービスレイヤは、2つのリポジトリを調整する必要があります。

+0

どのように?私はそれをどうやって行うのか分かりません。基本的に同じコードで2つの異なるオーバーロードされたメソッドを用意していない限り、その1行が必要です。 – chobo2

関連する問題