Net6.0基于拓扑排序的模块化

模块化这里说的是在NetCore中,Configure ConfigureServices都是在同一个地方里面配置完所有的信息 比如服务注入容器/身份认证/鉴权授权/中间件的使用等。如果项目大了内容很多都比较不清晰。这里可以通过模块的方式,把每一部分抽象出来,然后通过特性依赖的方式,实现依赖,构成项目。

项目在Github:OpenDeepSpace.Modularity
可以在Nuget上面搜索 OpenDeepSpace.Modularity直接使用

这里你需要实现AbstractModule:

[DependsOnModules(typeof(ModuleB),typeof(ModuleC))]
    public class ModuleA : AbstractModule
    {
        private  ILogger<ModuleA> logger;

        public override void ConfigureServices(IServiceCollection services)
        {
            logger = services.BuildServiceProvider().GetRequiredService<ILogger<ModuleA>>();
            logger.LogInformation($"{nameof(ModuleA)}.{nameof(ConfigureServices)}");
        }

        public override void Configure(IApplicationBuilder app) //Configure是可选的实现方法 可以不重载 这是一个virtual方法
        {
            logger.LogInformation($"{nameof(ModuleA)}.{nameof(Configure)}");
        }
    }

[DependsOnModules(typeof(ModuleC))]
    public class ModuleB : AbstractModule
    {
        private ILogger<ModuleB> logger;
        public override void ConfigureServices(IServiceCollection services)
        {
            logger = services.BuildServiceProvider().GetRequiredService<ILogger<ModuleB>>();
            logger.LogInformation($"{nameof(ModuleB)}.{nameof(ConfigureServices)}");
        }

        public override void Configure(IApplicationBuilder app)
        {
            logger.LogInformation($"{nameof(ModuleB)}.{nameof(Configure)}");
        }
    }
    
public class ModuleC : AbstractModule
    {

        private ILogger<ModuleC> logger;
        public override void ConfigureServices(IServiceCollection services)
        {
            logger = services.BuildServiceProvider().GetRequiredService<ILogger<ModuleC>>();
            logger.LogInformation($"{nameof(ModuleC)}.{nameof(ConfigureServices)}");
        }

        public override void Configure(IApplicationBuilder app)
        {
            logger.LogInformation($"{nameof(ModuleC)}.{nameof(Configure)}");
        }
    }

然后在对应模块上DependsOnModules来完成依赖:

[DependsOnModules(typeof(ModuleB),typeof(ModuleC))]
public class ModuleA : AbstractModule

使用模块化:

//添加入口Module
builder.Services.AddModule<ModuleA>();

//使用Module
app.UseModule();

上面的完成即可实现不同的模块Configure ConfigureServices各自写在不同的位置,然后只需要依赖即可。

运行结果如下:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值