天天看点

abp、dotnet core 之模块化编程有感

netcore 发展到现在已经到了 3.0 版本,而 abp 作为典型的 ddd框架模板,也已经在诸多项目中得到实践。

说来惭愧,在.net 平台有做了差不多三年了,这两个好东西一个都没有好好学习理解过。

正好前段时间决心学习 abp,对 abp 的模块概念有了了解,而最近一个偶然机会,使用 netcore 做个简单的项目,意外的发现abp和netcore 的模块设计思想是极其的相似!

全局依赖注入

abp 和 core 都使用了一个全局依赖注入的方式,所有的模块通过容器进行注册,然后在程序中的不同地方随时使用注册了的服务。使用 依赖注入的好处显而易见,避免了在代码中写死代码,大大的减少了代码的耦合程度,便于调整和维护。

1.在 abp 中注册模块服务的做法是,在模块自己实现 abpmodule,启动程序在启动时去遍历依赖模块中实现了  abpmodule 的类,然后调用初始化流程(abp中初始化详细流程请移步 abp相关文档)。初始化的过程就是将模块定义的功能服务注册到容器中,那么主程序或者其它调用的模块使用模块的服务时,就可以通过注入的方式自动从容器中获取到服务对象。

2.而在netcore 的模块注册方式是在 ConfigureService 方法(相当于启动方法)通过调用 app.AddXXXX()  来注册模块,这个 AddXXX 实际上是一个扩展方法,模块自身实现一个模块初始化的扩展方法,在启动方法调用时会传入容器对象,而后模块自己做自己模块的注册调用。

模块配置

使用模块化编程自然时要考虑模块适应不同的应用场景和情况,那自然是少不了在使用模块时时对模块进行动态配置。abp和netcore都提供了便捷的配置方案。

1.abp中的模块通过对 abpconfig基类实现扩展方法,在主程序配置时,只需调用对应模块的配置扩展方法即可进行模块的配置(有点类似 netcore模块注册的方式)。

2.netcore 的配置就更加简单直接了,在调用 AddXXXX() 注册模块的同时,模块往往提供带有配置参数的重载方法,在进行模块的注册时,就顺便进行配置信息的配置。

后话

 解耦和扩展在程序开发中无非是经常谈起的,通过面向抽象编程,使用依赖注入的方式来管理对象的创建,大大降低了耦合度,而使用模块化的编程方式一来模块功能的复用减少重复编码的问题,通过还可以根据具体的情况实现不同需求的模块,需求的变更和扩展就方便了。

在一般的程序开发中如果使用 依赖注入+模块化的方式进行开发的话,在开发和维护上的效率都会快上很多。