欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ABP之什么是ABP(ASP.NET Boilerplate)

程序员文章站 2023-04-08 08:57:51
1.介绍 ABP是开源的且文档比较齐全的应用程序框架。其实它不仅仅是个框架,考虑其最佳实践,ABP更提供了基于领域驱动设计(DDD)的强大价格模型。 ABP支持最新的ASP.NET Core和EF Core,同时也支持ASP.NET MVC 5.x和EF 6.x. 2.快速看一个示例 上面是一个Ap ......

1.介绍

abp是开源的且文档比较齐全的应用程序框架。其实它不仅仅是个框架,考虑其最佳实践,abp更提供了基于领域驱动设计(ddd)的强大价格模型。

abp支持最新的asp.net core和ef core,同时也支持asp.net mvc 5.x和ef 6.x.

2.快速看一个示例

public class taskappservice : applicationservice, itaskappservice
{
    private readonly irepository<task> _taskrepository;

    public taskappservice(irepository<task> taskrepository)
    {
        _taskrepository = taskrepository;
    }

    [abpauthorize(mypermissions.updatetasks)]
    public async task updatetask(updatetaskinput input)
    {
        logger.info("updating a task for input: " + input);

        var task = await _taskrepository.firstordefaultasync(input.taskid);
        if (task == null)
        {
            throw new userfriendlyexception(l("couldnotfindthetaskmessage"));
        }

        input.mapto(task);
    }
}

上面是一个application service 方法示例,ddd中方的application service直接由表示层调用来执行应用程序的用例。

将updatetask看成是javascript通过ajax调用的方法。

3.abp的优势

依赖注入(di):abp提供了传统的di基础设施,由于此类是应用程序服务,因此它通常在di容器中注册为瞬态(根据请求创建). 它可以简单地注入任何依赖项(例如此示例中的irepository <task>)。

仓储:abp可以为每个实体创建一个默认存储库(例如本例中的irepository <task>)。 默认存储库有许多有用的方法,例如本例中使用的firstordefault方法。 我们可以扩展默认存储库以满足我们的需求。 仓储库抽象了dbms和orm并简化数据访问逻辑。

授权:abp可以声明性的检查权限,如果当前用户没有“update tasks”权限或者未登录,abp会阻止访问updatetask方法。abp不仅使用声明性属性,而且还有其他一些授权方法。

验证:abp会自动检查输入是否为null,它还基于标准数据注释属性和自定义验证规则验证输入的所有属性。如果请求无效,则会抛出异常并在客户端进行处理。

审计日志:根据约定和配置,为每个请求自动保存用户,浏览器,ip地址,调用服务,方法,参数,调用时间,执行时长以及其他一些信息。

工作单元:在abp,每个应用程序服务方法默认都被假设成一个工作单元。它自动的在方法开始时创建一个连接并开始一个事务。如果这个方法没有任何异常的完成,事务会被提交并且释放连接。尽管这个方法用了不同的仓储或者方法,他们都将是原子的(事务的)。当一个事务被提交的时候,对实体的所有修改将会自动被保存。我们甚至不需要调用_repository.update(task),如上例所示。

异常处理:在一个abp的web应用程序中,我们几乎从来不用手动去处理异常.默认情况下所有的异常都会被自动处理!如果一个异常发生,abp会自动记录并向客户端返回正确的结果。比如,如果这是一个ajax请求,它返回一个json对象到客户端标识一个错误的发生。只有在userfriendlyexception情况下,它会隐藏真实的异常。它还可以处理客户端上的错误,并向用户展示相应的信息。

日志:我们可以使用在基类中定义的logger对象。默认使用log4net,但是这个是可更改可配置的。

本地化:注意我们在抛出异常时使用了'l'方法? 这样,它会根据当前用户的文化自动进行本地化。

自动映射:在最后一行中,我们使用abp的mapto扩展方法将输入属性映射到实体属性。 它使用automapper库来执行映射。 我们可以根据命名约定轻松地将属性从一个对象映射到另一个对象。

动态的api:taskappservice是一个简单的类。 通常我们必须编写一个包装器api控制器来向javascript客户端公开方法,但abp会在运行时自动执行该操作。 这样,我们可以直接从客户端使用应用程序服务方法。

动态ajax代理:abp创建代理方法,这些方法使调用应用程序服务方法就像在客户端上调用javascript方法一样简单。

我们可以在这个简单的类中看到abp的好处。 所有这些任务通常需要花费很长时间,但在abp中,框架都帮我们做了。我们只需要关注自己真正的业务。