2016-09-30 43 views
1

同僚は、エンティティと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; 
    } 

ていることに注意してください。私の心はこれを見て、「これは正しくない」と思っていますが、私はそれを説得力を持って正当化することはできません。

+1

'Add()'を呼び出すのは珍しいことですが、それが実際に何かを基底のストアに追加することは期待できません。たぶん 'new()'や 'create()'でも構いませんが、リポジトリはクラスのインスタンスを作る責任を負いません。 –

+0

@ stephen.vakilあなたの関心をお寄せいただきありがとうございます。実際のコードを抜粋して質問を更新しました。 Idフィールド - 誰がそれを作成し、いつ - それが私を最も悩ませるのか。 – heltonbiker

+0

OK、私が正しい仮定をしているならば、あなたが更新したパターンは私にとっては全く合理的です。リポジトリ外のレイヤからEntity Frameworkの存在を隠したい場合、repoレイヤにエンティティにマップされるdtoを取り込むことは妥当です。あなたが追加をしているときに、あなたは '患者 'とのさらなる行動を取ることができるので、DBによって生成されたIDを返すことをしばしば望みます。 –

答えて

1

最終的に、複雑さとアーキテクチャ上の意思決定については「正しい」答えはありません。あなたが指摘したように、アプリケーションが小さければ、エンジニアリングするには余りにも多くのレイヤーが必要かもしれません。一方、アプリケーションのサイズが大きくなると、後でリファクタリングするのは難しくなります。

DTOのインスタンス化の問題については、インスタンス化だけです。デフォルトのコンストラクタを呼び出していてコンストラクタが非効率的な動作をしている場合、つまり複雑なロジックを実行したり、副作用のあるものを実行するのではなく、デフォルトの "空の"インスタンスを設定するだけです。 DTO - あなたがどこでそれを行うかは本当に問題ではありません。

クライアントの方が簡単ですし、1回の往復を節約できると思います。

クライアントにDTOの「ID」フィールドについて知らせたくない場合は、internalフィールドまたはプロパティにして、リポジトリコードに設定します。

+0

ニース!ただし、DtosにはIDフィールドがあるため、更新するエンティティインスタンスをリポジトリが知ることができるので、そのIDを作成するのが合理的だと思いますか?現在、DtoコンストラクタはIdを設定しません。これは 'repo.Add(TDto dto)'メソッドによって設定されます。しかし、TDtoにはパブリックIdプロパティがあります!それについての提案はありますか? – heltonbiker

+0

ホールド、私は[ファウラー](http://www.martinfowler.com/books/eaa.html)(良い本、ちなみに)チェックしています.... –

+0

私は実際のコードで自分の質問を更新し、私の例では2つのシグネチャが混在しています。私はそれはかなり臭いがわかりますが、それは何かにおいがわかりません... – heltonbiker

関連する問題