8


3

私はこの問題にどう取り組むかを考え出そうとしています。 いくつかのデータを2つのテーブルに挿入する必要があります。それらをテーブルAとテーブルBと呼びます。

表Aには、これらの列があります。A1d A1 A2 A3

テーブルBはA1d A1 B2 B3 B4を持っています

今私の最初の質問は別のリポジトリが別のリポジトリを呼び出すべきかということでしたか? これが私の現在の問題を解決するとは思わないが、将来の参考のためにこれを知りたいだけなのではないか。

今私の問題に。

テーブルAを作成するためにリポジトリ層(TableARepository)で作成を呼び出すと tableBのフィールドもすぐに作成します。

// linq to sql.
TableA myATable = new TableA(); dbContext.myATable.A1 = "hi"; //これらすべての値はパラメータから取得されます。 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 tableは、 "hi"に等しくない場合に限り、このテーブルに挿入される情報だけを持つべきです。

そのためparam1!= "hi" //挿入param1 == "hi" //無視してテーブルAのみを挿入

だからこれは私がこのように私のTableBをラップする必要があるだろうことを意味するだろう

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(); }

これはほとんどビジネスロジックのように思えるので、今私はここでこれを行うべきかどうかわからない それでもnullであってもcreateメソッドに挿入する値を渡す必要があるため、どちらの方法でもこのビジネスロジックの実行方法がわかりません(A1はNULL可能フィールドです)。

だから、私はTableA.Id、A1でtableBサービス層のパスを呼び出す必要がありますA1が何であるかを確認します。 うまくいけばそれではTableBリポジトリに行ってそのように挿入しますか?

そのためTableARepostiory - > TableBサービスレイヤ - > TableBRepository(その値が見つかった場合は!= "hi")

だから私は何をすべきかわからない。

2 Answer


10


いいえ - リポジトリが他のリポジトリや他のサービスを呼び出す理由は考えられません。 彼らの唯一の関心事はあなたのエンティティを永続化し、データストアからエンティティを取得することです。 基になるドメインを除いて、それらはあなたのアプリケーションのほとんどの側面に無知であるべきです。

あなたはそれらがテーブルごとのリポジトリであるべきだと仮定しているように思えますが、これは正しくありません。 集約ルートごとに1つのリポジトリーがあり、そのリポジトリーは、基礎となるすべての関連テーブルにデータを保管します。 データの保存場所や保存方法に関するロジックがリポジトリにあることは問題ありませんが、可能であれば共通領域にカプセル化するのが最善です。

たとえば、人物オブジェクトを持ち、性別に応じて異なるテーブルに保存する必要がある場合は、継承を使用してこれを実行できます((personがWomanの場合)ここで保存します…​ )またはオブジェクトのプロパティ(if(person.Gender == Gender.Fqueous))ここに保存…​ )または仕様((FemaleSpecification.IsSatisfiedBy(人)の場合)はこちらから保存…​ )


1


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

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