0

私は自分のプロジェクトのリポジトリを作成しています。実際にはそのサブセットであり、c#、poco、および古い ado.net (ORM なし) を使用しています。私はいくつかのエンティティを持っており、リポジトリは DAL を介してそれらを CRUD します。私のDALはIDisposableなので、データベースをインスタンス化するときにデータベースへの接続を開き、Disposeメソッドでその接続を閉じることができました。今知りたいのですが、リポジトリでエンティティごとに1つのクラスを使用する必要がありますか、それともそれらすべてに対して1つの巨大なクラスを使用する必要がありますか? 2 番目のアプローチでは、接続を開き、必要に応じて多くのエンティティを取得してから閉じることができます。次のように、エンティティごとに 1 つの接続を開いたり閉じたりした最初のもの:

 //One big class for all entities, opens one connection
 using(RepositoryForAll rfa = new RepositoryForAll())
 {
     Customer c = rfa.GetCustomer(Customerid);
     Order o = rfa.GetOrder(OrderId);
 }
 //closes the connection

 //One repository class per entity, also one connection
 using(RepositoryCustomer customers = new RepositoryCustomer())
 {
     var c = customers.Get(CustomerId);
 }
 //closes the connection for RepositoryCustomer

 using(RepositoryOrder orders = new RepositoryOrder())
 {
     var c = orders.Get(OrderId);
 }
 //closes the connection for RepositoryOrder 

意味あり?別のアプローチを提案する本で AggregateRoot について読みました。これはかなり単純な例であり、私のリポジトリはそれほど洗練されている必要はありません。

4

2 に答える 2

1

別の解決策はどうですか?リポジトリの外部で接続 (またはトランザクション、または作業単位) を作成し、それをリポジトリに渡します。
そのようです-

using(var tx = new Transaction())
 {
     RepositoryCustomer customers = new RepositoryCustomer(tx)
     RepositoryOrder orders = new RepositoryOrder(tx)
     var c = customers.Get(CustomerId);
     var o = orders.Get(OrderId);
 }  

(もちろん、これは単純な例にすぎません。オブジェクトを自分でインスタンス化するのではなく、ある種の IoC メカニズムを使用することをお勧めします。また、ここで適用される可能性のある概念
について少し読みたいと思うかもしれません)Unit of work

于 2013-04-10T21:14:18.027 に答える