一、概述
Abp
的 DI 容器是基于 Microsoft
的依赖注入扩展库(Microsoft.Extensions.DependencyInjection nuget包)开发的。因此,它的文档在 Abp
中也是有效的。Abp
中可以使用 Autofac
替换内置 DI 容器的,以支持属性注入和动态代理(拦截器)。
Abp
提供的服务自动注册功能用内置的DI
容器也能实现。
去年写过一篇《ASP.NET Core 授权的扩展:自定义 Authorize Attribute 和 IApplicationModelProvide》,由于在 ASP.NET Core
3 中,Microsoft.AspNetCore.Mvc.Internal
命名空间下的 AuthorizationApplicationModelProvider
类由 public
被改为了 internal
,使得无法方便地将其从容器中 DI
容器中移除,所以不得不回到 IAuthorizationPolicyProvider
上来。
ASP.NET Core
提供了基于角色( Role
)、声明( Chaim
) 和策略 ( Policy
) 等的授权方式。在实际应用中,可能采用部门( Department
, 本文采用用户组 Group
)、职位 ( 可继续沿用 Role
)、权限( Permission
)的方式进行授权。本文通过自定义 IAuthorizationPolicyProvider
进行扩展。
通常我们会在 Startup
类通过 void ConfigureServices(IServiceCollection services)
配置应用的服务。常见的形如 AddXXX
的方法,实际上调用的都是 IServiceCollection
或直接说是 ServiceCollection
的 AddSingleton
、AddTransient
和 AddScoped
等方法。调用ApplicationBuilder
的 RequestDelegate Build()
方法会调用 IServiceCollection
的扩展方法 BuildServiceProvider
会创建并返回一个 ServiceProvider
对象。
还会在 Startup
类通过 void Configure(IApplicationBuilder app, IHostingEnvironment env)
配置请求管道,在该方法内进行的主要操作是添加中间件。常见的形如 UseMiddleware
或 UseXXX
的方法,实际上调用的都是 IApplicationBuilder
或直接说是 ApplicationBuilder
的 IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware)
方法,Use
方法并不是马上将中间件配置入请求管道,而是将“实例化中间件的方式”保存到 ApplicationBuilder
内部一个列表的操作。调用ApplicationBuilder
的 RequestDelegate Build()
方法会实例化中间件并把各个中间件串联起来。