2013-04-10 35 views
0

我正在爲我的項目創建一個存儲庫,實際上是它的一個子集,使用c#,poco和舊的ado.net(沒有ORM的)。 我有幾個實體,我的存儲庫會通過DAL對這些實體進行CRUD。 我的DAL是IDisposable,所以我設法在實例化它時關閉數據庫連接,並在Dispose方法中關閉連接。 現在我想知道,我是否需要在存儲庫中爲每個實體使用一個類或爲它們全部使用一個大類? 第二種方法將允許我打開連接,檢索許多實體,然後關閉它。第一個我必須打開並關閉每個實體的一個連接,如下所示:在一個使用c#的倉庫中,poco和ado.net什麼是最好的,一個類用於整個倉庫還是每個實體有幾個類?

//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的內容,這提示了另一種方法。 這是一個相當簡單的示例,我的存儲庫不一定非常複雜。

回答

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概念,這裏可能適用)

+0

聽起來不錯!我忘了IoC ... – 2013-04-10 21:26:00

0

組織可管理組中的類。

就你而言,我認爲Order和Customer應該屬於OrderRepository。

產品將進入CatalogueRepository。

如果在單元測試時需要模擬類,則它們進入它們自己的存儲庫。這可能是一個PaymentRepository。

+0

這是我上面提到的Aggregate root,並沒有解決我的問題...無論如何,謝謝! – 2013-04-10 21:27:47

相關問題