组件与初始化

在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的实现主要由三个方法ConfigureServicesConfigureConfigureInitializer构成。


启动后初始化

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初始化完成的字样 image.png|1000

results matching ""

    No results matching ""