组件与初始化
在Aegis中,大部分系统组件都是由Aegis的Component.deps.json
来管控是否引入的。
但是个别需要自定义来源(Source)的组件需要自行实现后手动注入,其中最常见的便是数据库组件和Redis组件。故而Aegis也提供了自定义Startup。
自定义Startup
在WebApi层可以实现自己的Startup
来注入数据库、Redis和自己的服务组件;引入各类中间件。
下述代码就是一个基本的ICustomStartup
的实现。
using Aegis.Caching.Redis;
using Aegis.Configuration;
using Aegis.Core.FreeSql;
using Aegis.Core.Infrastructure;
using Aegis.Generic.IdGenerator;
using Aegis.IdGenerator.Provider.Redis;
using Aegis.Webapi.Repository;
namespace Aegis.Webapi.BaseDemo;
/// <summary>
///
/// </summary>
public sealed class Startup : ICustomStartup
{
//这个方法用于注入服务组件到容器内
public void ConfigureServices(IServiceCollection services)
{
//注入数据库
var connectionString = ConfigManager.Get("SqlConnection");
services.AddDbSource<AegisDb>(x =>
{
x.ConnectionString = connectionString;
x.DataType = "SqlServer";
});
services.AddDbRepositories<AegisDb>();
//管理Cors
services.AddCors(policy =>
{
policy.AddPolicy("CorsPolicy", opt => opt.AllowAnyOrigin()
.AllowAnyHeader().AllowAnyMethod()
.WithExposedHeaders("X-Pagination")
.WithExposedHeaders("X-Request-Id") //这个用于对外展示框架提供的X-Request-Id,暂时得手动添加,后续Aegis会主动承担这部分内容
);
});
//注入Redis
services.AddRedisSource<AegisRedisSource>(ConfigManager.Get<RedisOptions>("Redis"));
//注入Id模版容器和提供者
services.AddIdRedisContainer<AegisRedisSource>();
services.AddIdTemplateProvider<TemplateProvider>();
services.AddIdTemplateProvider<Template2Provider>();
}
//这个方法用于引入中间件
public void Configure(IApplicationBuilder app)
{
app.UseAuthorization();
app.UseCors("CorsPolicy");
}
//这个方法可以继承也可以不继承,用于配置项目初始化后都干什么
public void ConfigureInitializer(IInitializerContext context)
{
context.AddInitializer<PrintInitializer>();
}
}
可以看到一个ICustomStartup
的实现主要由三个方法ConfigureServices
、Configure
、ConfigureInitializer
构成。
启动后初始化
ConfigureInitializer(IInitializerContext context)
方法与传统的ASP.NET Core稍有不同,是Aegis额外提供的项目启动后的初始化方法,在项目启动后将按顺序执行这个方法下注入的初始化组件。
IInitializer 初始化器实现
一个IInitializer
的实现比较简单,只需要继承对应接口实现Initialize
即可,该初始化器的构造方法可以正常获取容器内组件。可以利用它来实现项目启动时的检查等工作。
using Aegis.Core.Infrastructure;
using Aegis.Webapi.Repository;
using Aegis.Webapi.Repository.Entities;
namespace Aegis.Webapi.BaseDemo;
public class PrintInitializer : IInitializer
{
private IFreeSql<AegisDb> _freeSql;
public PrintInitializer(IFreeSql<AegisDb> freeSql)
{
_freeSql = freeSql;
}
public void Initialize()
{
var count = _freeSql.Select<UserEntity>().Count();
Console.WriteLine($"当前用户数:{count}");
}
}
实现后,在ConfigureInitializer
方法下,可以利用获得的IInitializerContext
来添加实现好的初始化项。
public void ConfigureInitializer(IInitializerContext context)
{
context.AddInitializer<PrintInitializer>();
}
在项目启动后会显示XXX初始化完成
的字样