Identity – 冷知识

RoleManager, RoleStore, EF Core 关系

RoleManager 可以理解为一个上层 service, 是让我们操作 Role 的. 比如 create, update, delete 等.

RoleStore 可以理解为一个 repository, 默认情况下, 它内部是使用 EF Core 来做 Persistence.

如果我们不想使用 EF Core 的话也可以自己实现一个 IRoleStore 读写数据库

另外如果想使用 RoleManager.Roles 直接操作 IQueryable 的话. RoleStore 必须实现 IQueryableRoeStore 接口

对于 build-in 的 EF Core, 要实现 IQueryable 自然是很容易的.

RoleManager 如何做 transaction

有时候, 想批量创建或删除 Roles. 这就需要用到 transaction 确保原子性.

Manager.Create -> Store.Create -> DbContext.SaveChanges

  

transaction 在 DBContext 里, Manager 的 Store 是 protected 的, 即便它是 public, 它也只是一个 IRoleStore

而 IRoleStore 完全没有获取到 DbContext 的方法.

所以从这里可以确定, Identity 不支持 transaction 概念.

那怎么办? 

如果不 care 管理的话, 可以直接在应用层调用 DbContext. 因为"我们知道“它们是一样的.

但如果 "我们不知道" 的话. 那用 TransactionScope 会解耦一些.

但我觉得这些都只是 workaround, 毕竟 Identity 不是应该要支持 transaction 的吗?

原文地址:https://www.cnblogs.com/keatkeat/p/15682857.html