为什么要使用ABP框架?

我们干开发也有几年经验了,web应用、桌面应用也都做过,需求简单或复杂,实现优雅或凑楼。一个基本的事实是:我们只是基类了一些经验或者提高了对.net的熟悉程度。

随着开发经验的不断增加,我们发现其实很多工作都是机械的,重复的,而且随着软件的复杂度不断提神,以往依靠经验完成一些简单的增删改查的做法已经行不通了。特别是用户的要求越来越高,希望添加的功能越来多,目前这种开发模式,已经捉襟见肘。我很难想象如何在现有的模式下进行多系统的持续集成并添加一些新的特性。
开发一个系统时,我们不可避免的会使用各种框架。数据持久层实现、日志、ASP.NET MVC、IOC以及自动映射等。一个高质量的软件系统往往还有全局容错,消息队列等组件。
把上述这些组件组合到一起的时候,其复杂度会急剧上升。一般个人和小团队的技术水平,很难设计出一个均衡协调的框架。对于传统的所谓三层架构,我也是很持怀疑态度的。(月薪15k的程序员搞的三层架构,我也仔细读过,也是问题多多,并不能解释为什么要使用三层)。
其实,我们无非是希望在编程的时候,把大部分的注意力全部集中到业务实现上。不要过多的考虑基础的软件结构上的种种问题。应该有一个框框或者一种范式来提供基本的服务,如日志、容错和AOP,DI等。
稍微正规一点的公司经过多年沉淀都形成了自己的内部软件框架,他们在开发软件的时候并不是从一片空白开始的。而是从一个非常牢固的基础平台上开始构建的。这样大大提高了开发速度,而且一种架构往往也决定了分工协作的模式。我们目前之所以无法分工协作,根本原因也是缺少一套成熟稳定的基础开发架构和工作流程。
目前.NET上有不少开源框架。比如Apworks和ABP。其中Apworks是中国人写的一套开源框架。它是一个全功能的,不仅可以写分布式应用,也可以写桌面应用。ABP的全称是Asp.net boilerplate project(asp.net样板工程)。是github上非常活跃的一个开源项目。它并没有使用任何新的技术,只是由两名架构师将asp.net开发中常用的一些工具整合到了一起,并且部分实现了DDD的概念。是一个开箱即用的框架,可以作为asp.net分布式应用的一个良好起点。
使用框架当然有代价,你必须受到框架强API的侵入,抑或要使用他的方言。而且这个框架想要吃透,也要付出很大的学习成本。但是好处也是显而易见的。业界顶尖的架构师已经为你搭建好了一套基础架构,很好的回应了关于一个软件系统应该如何设计,如何规划的问题,并且提供了一套最佳实践和范例。
学习虽然要付出成本,但是经过漫长的跋涉,我们从一无所知已经站到了工业级开发的门槛上。基于这个框架,我们可以很好的来划分任务,进行单元测试等。大大降低了软件出现BUG的几率。
不能因为我们是业余开发人员,就止步不前,要积极拥抱新的技术趋势。不断巩固提升自己的基础知识。革命尚未成功,诸君努力!

### 使用 ABP 框架编写接口 在ABP框架中,定义和使用接口不仅有助于提高代码的可读性和灵活性,而且对于依赖注入机制来说也是至关重要的。即使不强制要求所有的`Manager`类都必须继承自某个特定接口,在实际应用中推荐这样做以增强系统的模块化程度以及便于单元测试。 当涉及到如何具体实现依赖注入时,特别是在Application Service层调用Domain Layer里的Manager对象的情况下,通常做法是: - 定义一个接口用于描述Manager的行为; - 创建具体的Manager类并让其实现上述接口; - 将该Manager及其对应的接口注册到DI容器内; 这样做的好处是可以轻松替换不同版本的具体实现而无需修改其他部分的代码逻辑[^1]。 下面给出一段简单的例子展示怎样利用ABP创建一个领域服务(`ProductManager`)并将它作为依赖项注入到另一个组件里: #### 步骤说明 假设有一个名为 `IProductManager` 的接口用来管理产品相关的业务操作,还有一个实现了此接口的具体类叫做 `ProductManager`. ```csharp // IProductManager.cs 文件内容如下所示: public interface IProductManager : ITransientDependency { Task CreateAsync(Product product); } // ProductManager.cs 文件内容如下所示: public class ProductManager : IProductManager{ private readonly IRepository<Product, Guid> _productRepository; public ProductManager(IRepository<Product, Guid> productRepository){ _productRepository = productRepository; } public async Task CreateAsync(Product product){ await _productRepository.InsertAsync(product); } } ``` 接着需要向ABP框架告知这些类型的映射关系以便于后续能够正常工作。这一步可以通过重写模块配置方法完成: ```csharp ConfigureServices((hostContext, services) => { // 注册我们的 Manager 及其接口至 DI 容器中. services.AddTransient<IProductManager, ProductManager>(); }); ``` 最后可以在任何地方像下面这样简单地声明所需的服务即可获得实例化的对象供自己使用. ```csharp private readonly IProductManager _productManager; public MyService(IProductManager productManager){ _productManager = productManager; } ``` 以上就是基于ABP框架下较为标准的一种方式来设计接口和服务之间的交互模式[^3].
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值