如何读懂Microsoft.AspNetCore.Identity中AddRoleStore泛型方法的文档?
区分泛型方法的类型参数和传入类型自身的泛型参数
文档里的AddRoleStore<TStore>是泛型方法,TStore是这个方法的唯一类型参数,仅要求它是一个类(class约束)。你传入的RoleStore<ApplicationRole, ApplicationDbContext, Guid>是一个具体的泛型类型——它本身是带3个泛型参数的类,但对于AddRoleStore<TStore>来说,整个RoleStore<...>就是它要的TStore类型,完全符合class的约束。拆解类型的层次关系
把AddRoleStore<TStore>里的TStore看作一个“占位槽”,只要是符合约束的类型都能填进去,不管这个类型本身是不是泛型。比如RoleStore本身的定义是public class RoleStore<TRole, TContext, TKey> : ...,当你给它的泛型参数都填好具体类型后,就得到了一个可以被DI容器识别的具体类,这个类就是AddRoleStore需要的TStore。查看类型的继承/实现关系
文档里只写了TStore : class,但实际AddRoleStore要求TStore必须实现IRoleStore<TRole>接口(这是Identity框架的设计逻辑)。你可以直接查看RoleStore的定义,确认它确实实现了对应的接口,这也是它能被传入AddRoleStore的核心原因。从方法作用反推逻辑
AddRoleStore的作用是向DI容器注册角色存储的具体实现,所以它需要的是一个实现了角色存储接口的具体类型——不管这个类型本身有多少泛型参数,只要最终是合法的、符合接口要求的类,就能作为TStore传入。
内容的提问来源于stack exchange,提问作者user3348988

