存储库和数据访问代码之间的抽象层

时间:2012-09-24 16:39:48

标签: c# ddd-repositories

我尝试将存储库与实际数据存储实现隔离开来。用这个抽象创建一些简单的查询我没有什么问题。

示例我需要按顺序排列订单行的订单列表。

Repository方法返回OrderInfo对象列表。

class OrderInfo
{
    string Title { get; set; }
    int NumberOfLines { get; set; }
}

数据存储不包含任何直接包含订单行计数的字段,因此必须即时计算。

当查询直接写入存储库方法时,可以使用简单的sql查询(count + group by)轻松存档。

如果我尝试创建某种抽象层,我就失去了如何“定义查询而不使用任何与存储相关的东西,包括它应该返回每个订单的订单行数”。

或者我完全走向错误的方向?

1 个答案:

答案 0 :(得分:0)

如果你想允许在BLL中使用IQueryable(我认为应该这样做),那么你可以根据需要定义查询。你的DAL应该传递的标准之一是它与你的BLL一起使用,它是否应该能够获取IQueryable,并使用它来读取一些数据。这样你就可以在BLL中“聪明”,并且DAL将被抽象化。

示例:

  • BLL - 使用接口定义它。生成的上下文接口为您提供系统中的所有实体(=表)。这些实体将随IQueryable<entityType>一起提供。使用Entity Framework POCO's定义实体。
  • DAL - 实体框架上下文,其中上下文实现您在BLL中定义的接口。

每个图层都在自己的程序集中。使用一些依赖注入将DAL连接起来。

请记住,这只是一个例子。

更新

阅读关于洋葱架构的this文章,这正是您想要做的。