0

我正在为我的项目创建一个存储库,实际上是它的一个子集,带有 c#、poco 和旧的 ado.net(没有 ORM)。我有几个实体,我的存储库将通过 DAL 对它们进行 CRUD。我的 DAL 是 IDisposable,因此我在实例化它时设法打开了与数据库的连接,并在 Dispose 方法中关闭了该连接。现在我想知道,我应该在存储库中为每个实体使用一个类还是为所有实体使用一个巨大的类?第二种方法将允许我打开连接,根据需要检索许多实体,然后关闭它。第一个我必须为每个实体打开和关闭一个连接,如下所示:

 //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 回答
0

在可管理的组中组织课程。

在您的情况下,我认为 Order 和 Customer 应该属于 OrderRepository。

产品将进入 CatalogueRepository。

如果在单元测试时需要模拟类,它们会进入自己的存储库。那可能是一个 PaymentRepository。

于 2013-04-10T21:18:16.383 回答