同僚は、エンティティとDtosの規約を使用して、アプリケーションでリポジトリパターンを実装しています。これは彼の考えであり、私はイディオムに精通していません。リポジトリ項目をリポジトリインタフェースの外に作成する必要がありますか?
は現在、エンティティとのDTOとの主な相違点は以下のとおりです。
- エンティティは、(DTOSがあまりにも、私はそれが臭い見つけるしている)IDフィールドを持っています。
- Dtosは
Clone
の方法を有する。 - エンティティプロパティはシリアル化に適したデータ型が多く、変換はデータマッパーで実行されます。
質問です:
私はレポに送っ、クライアント側で自由に私のDTOを作成し、されるべきか?または、新しいDtoインスタンスだけをrepoインターフェイスでに要求する必要がありますか?
これは違い次のようになります。
TDto dto = new TDto();
// edit dto properties
repo.Add(dto)
と
TDto dto = repo.Add(); // repo : Repository<TDto>
// edit dto properties
repo.Update(dto);
preferrable方法はありますか?それが好みの問題で、私が第二の選択肢を好むなら、私はあるコーナーに自分自身をペイントしないように気を付けるべきですか?
(免責事項:私はこのEntity/DtoはシンプルなシリアライゼーションベースのCRUDのニーズしかない比較的シンプルなクライアントデスクトップアプリケーションでは過度だと思っていますが、解決している限り「パターン」に従います。問題の代わりに邪魔になっての)
UPDATE:私は現在直面して解決しようとしています
一つの問題は、「臭いイドプロパティ」です。現在、Idは追加時にDtoに設定されます。コードは次のようなものです:メソッドの呼び出しはレポで作成された値に自身のIDが設定されただけで、今、同じDTOを返す
public Patient Add(Patient patient)
{
patient.Id = Guid.NewGuid();
var entity = patient.ToEntity();
_patientsCache.Add(entity);
this.Salvar();
return patient;
}
ていることに注意してください。私の心はこれを見て、「これは正しくない」と思っていますが、私はそれを説得力を持って正当化することはできません。
'Add()'を呼び出すのは珍しいことですが、それが実際に何かを基底のストアに追加することは期待できません。たぶん 'new()'や 'create()'でも構いませんが、リポジトリはクラスのインスタンスを作る責任を負いません。 –
@ stephen.vakilあなたの関心をお寄せいただきありがとうございます。実際のコードを抜粋して質問を更新しました。 Idフィールド - 誰がそれを作成し、いつ - それが私を最も悩ませるのか。 – heltonbiker
OK、私が正しい仮定をしているならば、あなたが更新したパターンは私にとっては全く合理的です。リポジトリ外のレイヤからEntity Frameworkの存在を隠したい場合、repoレイヤにエンティティにマップされるdtoを取り込むことは妥当です。あなたが追加をしているときに、あなたは '患者 'とのさらなる行動を取ることができるので、DBによって生成されたIDを返すことをしばしば望みます。 –