9

我正在使用 ASP.NET MVC 设计一个网站,我可能对存储库的确切性质有点困惑。

按照 NerdDinner 示例,我的站点应该有一个存储库,可以根据需要为实体提供服务。但是,我还听说您应该有不同的存储库来处理特定的相关实体集....?

就我的网站而言,将有许多实体(大约 15 个表),但大多数都是相关的。拥有一个包含拉/更新/删除等所需的所有方法的存储库是否可以/可取,还是应该将它们拆分?

4

8 回答 8

8

我使用一个通用存储库,它对许多实体来说已经足够了。

对于更复杂的,我只是用需要的东西来扩展它。真是两全其美。

于 2009-09-24T16:26:13.103 回答
8

在域驱动设计中,存储库是每个聚合根的规则。你可以在这里阅读更多关于它的信息。

我读的越多,我就越认为 NerdDinner 经常被视为良好实践的集合,而事实并非如此(请参阅此处,特别是关于 NerdDinner 存储库的讨论)。这就是为什么人们经常责怪其他 MS 示例,例如Oxite(以及这里

开发者会蜂拥而至,赞美它,并盲目地接受它作为福音,因为它来自微软(它已经在路上了)。可悲的是,任何采用其精神的开发人员都将面临无法维护、无法测试和无法阅读的混乱局面

)。

于 2009-09-24T18:43:02.890 回答
5

如果您使用接受类型的通用存储库,那么我看不出有任何理由使用多个类型。

我们使用这样的接口:

public interface IRepository
{
    void Save<ENTITY>(ENTITY entity)
        where ENTITY : Entity;

    void Delete<ENTITY>(ENTITY entity)
        where ENTITY : Entity;

    ENTITY Load<ENTITY>(int id)
        where ENTITY : Entity;

    IQueryable<ENTITY> Query<ENTITY>()
        where ENTITY : Entity;

    IList<ENTITY> GetAll<ENTITY>()
        where ENTITY : Entity;

    IQueryable<ENTITY> Query<ENTITY>(IDomainQuery<ENTITY> whereQuery)
        where ENTITY : Entity;

    ENTITY Get<ENTITY>(int id) where ENTITY : Entity;

    IList<ENTITY> GetObjectsForIds<ENTITY>(string ids) where ENTITY : Entity;

    void Flush();
}

然后在这样的代码中使用:

var returnedObjects =  repository.GetAll<ObjectClass>();
var singleObject =  repository.Get<ObjectClass>(id);
于 2009-09-24T16:21:00.117 回答
2

我认为也许什么是存储库的措辞可能会让您感到困惑。对我来说,存储库是存储数据的数据存储(即 MS SQL 数据库)。

遵循存储库模式,我建议为每个数据存储设置一个存储库。我的大多数项目都使用 MS SQL,因此我为该数据库创建了一个存储库(我喜欢为我的 DAL/ORM 使用Subsonic,它还实现了存储库模式和 ActiveRecord 模式)然后我为每个表创建了工厂。这让我可以封装 Subsonic ActiveREcord 类并给我抽象。

希望这有帮助,也许...

于 2009-09-24T16:22:05.060 回答
2

我为每个数据对象创建一个存储库。

例如,一个简单的图书馆数据库可以包含以下存储库:

  • 作者存储库
  • 书库
  • 发布者存储库
于 2009-09-24T16:23:40.143 回答
2

您不应该为每个表创建存储库。正如queen3 所说,您应该为每个聚合根创建存储库。就像,如果产品可以有一个类别,那么类别存储库应该是产品的嵌套类。遵循域逻辑关系比域对象。

于 2011-01-09T11:27:59.717 回答
1

Queen3 是对的,您可以遵循 Aggregate Root 理论。我基本上对我的存储库进行分组,而不是考虑实体,而是它们如何在我正在构建的应用程序中进行逻辑分组。

例如:

CustomersRepository
OrdersRepository
...

在 CustomerRepository 中,我会放置 GetCustomers、GetCustomer、AddCustomer、DeleteCustomer、AddCustomerContact、DeleteCustomerContact 的方法。

在 OrdersRepository 中,我会放置 GetOrders、GetOrder、AddOrder、CancelOrder、CloneOrder、AddOrderDetail、DeleteOrderDetail 等方法。

于 2010-12-04T12:57:44.833 回答
0

我倾向于为每个相关的实体组使用一个存储库。即 orderrepository 可能有:

订单和订单详情。

并且会有另一个用于客户、客户资料等。

这使存储库类保持整洁。

戴维

于 2009-09-24T21:15:39.037 回答