der app)
{
Check.NotNull(app, nameof(app));
// 获取 IApplicationBuilde 的对象访问器,并将其值设置为 app。
app.ApplicationServices.GetRequiredService<ObjectAccessor<IApplicationBuilder>>().Value = app;
// 获得之前在 ConfigureService 注册的 Provider 类型,并调用其初始化方法。
app.ApplicationServices.GetRequiredService<IAbpApplicationWithExternalServiceProvider>().Initialize(app.ApplicationServices);
}
这里可能会疑惑 ObjectAccessor<IApplicationBuilder>
是在什么时候注入的,其实该类型是在 AbpAspNetCoreModule
模块注册的。
public class AbpAspNetCoreModule : AbpModule
{
// ... 其他代码
public override void ConfigureServices(ServiceConfigurationContext context)
{
// ... 其他代码
context.Services.AddObjectAccessor<IApplicationBuilder>();
}
// ... 其他代码
}
接着看初始化方法内部的操作,初始化方法定义是在基类当中,方法名是 InitializeModules()
,在方法内部,通过 IModuleManager
来执行模块的初始化方法。
protected virtual void InitializeModules()
{
using (var scope = ServiceProvider.CreateScope())
{
scope.ServiceProvider
.GetRequiredService<IModuleManager>()
.InitializeModules(new ApplicationInitializationContext(scope.ServiceProvider));
}
}
除了模块的初始化,模块的销毁动作 Abp vNext 好像是没有作处理,你可以挂载 IApplicationLifetime.ApplicationStopping
事件来手动执行模块的销毁方法。
三、总结
总体来说 Abp vNext 的启动流程与之前精简了许多,这是因为在新的框架当中将许多基础组件从核心层移除了,用户可以自由选择自己需要加载的组件。IoC 相关的代码则是通过的 Microsoft Dependency 提供的 IServiceProvider
/IServiceCollection
进行操作,没有了之前的 IocManager
。