DAL存储库模式使用dapper连接

时间:2016-12-19 19:34:02

标签: .net repository-pattern data-access-layer

尝试实现Repository模式,我发现的所有示例都非常简单(忽略连接)或使用实体框架。

我的数据库表格如下

tblUser {id, fname, lname, email, password, dateAdded}
tblAccount {id, name, isActive, dateAdded}
tblAccountUser {userId, accountId, isActive, dateAdded}

用户可以拥有多个帐户,一个帐户可以拥有多个用户。 tblUserAccount有一个布尔值,告诉我们用户是否对该帐户有效以及何时添加了用户。

我的pocos直接映射到具有关系的附加属性的表。有没有更好的方法来做这一部分?我想不出一个更好的方法让我的存储库返回GetUsersWithAccounts(userId)之类的关系。

tblUser {
    guid id, 
    string fname, 
    string lname, 
    string email, 
    string password, 
    date dateAdded, 
    IList<tblAccount> accounts
}

tblAccount {
    guid id, 
    string name, 
    bool isActive, 
    date dateAdded, 
    IList<tblUser> users
}

//should i have a tblAccountUser poco with something like
//{tblUser user, tblAccount account, bool isActive, date dateAdded}

我有以下存储库:

UserRepository {
    Add()...
    ...
    tblUser GetById(guid userId) {} 
    IEnumberable<tblUser> GetAll() {}

    //was unsure if Account repo should retrieve a user's accounts or if the user repo should.
    //using uow.User.GetAccounts(user.id) seems natural but please feel free to let me know what you think
    IEnumberable<tblAccount> GetAccounts(guid userId){} 

    //this is the one i was really unsure about
    //this would return tblUser obj with its tblUser.Accounts filled.
    IEnumberable<tblUser> GetAllWithAccounts()
}

AccountRepository{
    Add()
    ...
    AddUser(guid userId) //only adds relation to tblAccountUser Makes sense? 

}

//Should i have a repository for the Account <-> User relations?

问题到处都是,总结一下:

  1. 从我的回购中返回pocos时,我应该如何回归关系。正如我在上面的pocos中所展示的还是有更好的方法吗?
  2. 我的关系表应该得到自己的pocos吗?如果是这样,只有当他们有其他数据,如isActive和用户/帐户特定设置时。
  3. 在我的资料库中,我不确定在涉及到关系时哪个回购应该处理特定的请求。
  4. 我应该有另一个帐户/用户关系回购吗?
  5. 批评,链接,帮助所有欢迎致谢。

    编辑:

    补充说明:应该提到。我想要将用户/帐户放在一起的原因是因为它们将位于网格中,我们可以激活/停用和修改用户或帐户的值。

2 个答案:

答案 0 :(得分:1)

A 1&amp; 3当UserRepository方法返回tblUser对象时,不需要填充帐户。所有非集合属性都应由UserRepository处理。 在getter of accounts属性中,调用AccountRepository中的方法以进行数据库调用,以便在第一次调用getter时为用户获取所有帐户。

A 2关系表不需要自己的pocos。

A 4创建另一个存储库以单独处理帐户。

答案 1 :(得分:0)

也许部分答案是减压。存储库模式的重要部分是,您有一个包装数据库调用的类,它返回pocos,而不是ADO类,让您进行单元测试。化妆品部分是使用“选择”方法在同一类中插入/更新/删除方法的分组,让您忘记您正在处理数据库。为什么你想忘记是另一个问题。

获得repo类后,提取它的界面。粗略地,1个存储库对应于1个查询对应于1个平坦的结果集。在存储库中没有连接的概念。您的数据库中的联接可能对应于您的应用程序代码中的集合:User的实例将包含List或Dictionary或IEnumerable of Accounts,并且不会停止具有Users集合的Accounts实例。但用户和帐户不是存储库。它们可能是存储库返回的POCO。更常见的是,它们在应用程序的另一层中定义,并封装数据层返回的POCO。这就提出了一个明显的一致性问题,留待你解决:-)存储库模式对你没有帮助。如果您的用户在“用户”屏幕上选择帐户,则您的User对象可能会调用插入到某个存储库中的AccountUser的方法。如果在“帐户”屏幕上选择“用户”,则“帐户”对象可能会调用相同的方法。该方法可能位于UserRepo,或AccountRepo或SomeOtherRepoAlto。

尝试使用Dapper模拟实体框架是错误的。不要以为你可以编写你的存储库,然后永远不要触摸它们。 Dapper适合热爱数据库的人,并经常与之对话。回购可能会相互重叠。