ABP中有很多惯例,如果使用得当,可以事半功倍,如果使用不当,也会有很大的麻烦,是否适当其实还是要看Need需求

ASP.NET Boilerplate (ABP) is an open source and well documented application framework started idea of "developing a common framework for all companies and all developers!" It's not just a framework but also provides a strong architectural model based on Domain Driven Design and best practices in mind. 开源和文档友好,适合所有公司所有开发者的公共框架,基于DDD提供强壮架构,并且是最佳实践,这是作者的预期目标。
    看一下,代码例子,也许是程序员更喜欢的方式:
Here, we see a sample Application Service method. An application service, in DDD, is directly used by presentation layer to perform use cases of the application. We can think that UpdateTask method is called by javascript via AJAX. Let's see ABP's some benefits here:
Application Service 的方法,在DDD中对应的是UseCase用例,用例是什么?是用户需求,不清楚的同学请参考《有效需求分析》一书。从B/S角度看,该方法是由页面中js的AJAX调用的(其实也可能是被手机端APP调用的)。这个方式带来以下好处(注意要使用得当才有的,否则适得其反)
    • Dependency Injection : ABP uses and provides a strong and conventional DI infrastructure. Since this class is an application service, it's conventionally registered to DI container as transient (created per request). It can simply inject all dependencies (as IRepository<Task> in this sample).
      依赖注入,的确是个最佳实践,如果不用依赖注入,你的代码中可能由50%以上要考虑:如何实例化依赖(被调用方),但带来方便的同时,可能增加了阅读代码的难度,因为你看到的都是接口,实现都隐藏起来,找起来比较费劲。比如这里ApplicationService依赖的IRepository<Task>, 想真正了解它的代码,是间比较困难的。ABP中大量使用的依赖方式是,

      也就是惯例依赖,这个对刚开始接触ABP的开发者来讲,是需要好好理解,才能好好利用

      以上说明,实现ITransientDependency、 ISingletonDependency 、IInterceptor 这三个接口的类会被自动Register,当然也就可以Resolve注入; 其实IOC就是和一个全局的容器,可以把它看作一个巨大的一个全局变量,就时Register和Resolve 两个步骤,你存了银行,自然也能取钱了,就这么简单。

    • Repository : ABP can create a default repository for each entity (as IRepository<Task> in this example). Default repository has many useful methods as FirstOrDefault used in this example. We can easily extend default repository upon our needs. Repositories abstracts DBMS and ORMs and simplifies data access logic.
      Repository 实际上是ABP架构代码量比较大的一部分,它抽象了DBMS和ORMS, 其实和UnitOfWork也有关联,在实际项目的CRUD方面提供了几乎所有的几十个方法,遗憾的是没有提供数据库的批量插入、批量更新, 我自己做了个扩充,到时做成nuget库分享给大家
    • Authorization : ABP can check permissions. It prevents access to UpdateTask method if current user has no "updating task" permission or not logged in. It simplifies authorization using declarative attributes but also has additional ways of authorization.
      用户和角色管理,项目中的基本模块,原来Microsoft有个MemberShip, 现在用Identity,ABP这块集成的比较好,可以真正实现声明式编程
    • Validation : ABP automatically checks if input is null. It also validates all properties of an input based on standard data annotation attributes and custom validation rules. If request is not valid, it throws a proper validation exception.
      声明式验证,加上少量代码,基本上可以满足Need, 关键是直接用于DTO,而且有UI的配套,这块效率可以大大提高

使用ABP框架踩过的坑系列2的更多相关文章

  1. ABP框架踩过的坑系列6

    ABP框架踩过的坑系列6 应是无事.齐侯方才的确到了吴纠庭院https://www.mixcloud.com/ltTFvU888smi8jS/几日行军劳顿其实齐侯本应该睡下了https://www.m ...

  2. 使用ABP框架踩过的坑系列1

        企业级(例如ERP)应用, 一遍一遍的在重复:认证.验证.异常处理.日志.国际化和本地化.数据库连接管理.配置管理. 审计记录等,同时.NET有很多最佳实践:分层.模块化.DDD领域驱动.DI ...

  3. 使用ABP框架踩过的坑系列4

    数据库连接和事务管理,是数据库应用中的最重要概念之一.做过的人,都会头疼:何时Open一个连接?何时Start一个事务?何时Dispose这个连接?... ABP框架试图用一个叫做UnitOfWork ...

  4. 使用ABP框架踩过的坑系列5

    DDD领域驱动开发,实际是为复杂的业务场景而生的,为了让开发人员专注于业务,而操作系统.数据库.网络之类的技术细节,必须要持久透明化:实际就是数据库系统DBMS的ORM抽象,目标就是业务不需要考虑数据 ...

  5. 使用ABP框架踩过的坑系列3

    从架构角度来讲,ApplicationService究竟应该如何定位,一种说法是直接对应用例UseCase, 也就是直接对应UI, 这个UI是广义的,不仅仅是浏览器的页面,也包括API调用.还是从我曾 ...

  6. ABP框架踩坑记录

    ABP框架踩坑记录 ASP.NET Boilerplate是一个专用于现代Web应用程序的通用应用程序框架. 它使用了你已经熟悉的工具,并根据它们实现最佳实践. 文章目录 使用MySQL 配置User ...

  7. Abp框架之执行Update-Database 命令系列错误

    废话不多说,直接开门见山.首先的 第一个错误:一般都是,碰到这个问题不要慌,先不要急着去查看sql服务是否开启,首先按F5启动项目,报错之后直接终止项目,然后再执行Update-Database命令 ...

  8. 谈谈出入React框架踩过的坑

    1 在JSX的元素中写入内联样式,例如<div style={"color:blue"}></div> 报错:warning:Style prop valu ...

  9. 踩过的坑系列之InputStream.read(byte[])方法

    项目之前都是好好的,最近现场那边出现一个问题,报错不是合法的json字符串,这个json字符串是通过http请求访问获得的. 通过直接在浏览器上直接访问http这个请求,发现返回的json也是完全正确 ...

随机推荐

  1. tf.FIFOQueue()

    Tensorflow–tf.FIFOQueue详解描述tf.FIFOQueue根据先进先出(FIFO)的原则创建一个队列.队列是Tensorflow的一种数据结构,每个队列的元素都是包含一个或多个张量 ...

  2. Intersecting Lines(叉积,方程)

    Intersecting Lines http://poj.org/problem?id=1269 Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  3. 二叉树中的最大路径和 · Binary Tree Maximum Path Sum

    [抄题]: 给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和) [思维问题]: 不会写分合法 [一句话思路]: 用两次分治:ro ...

  4. How to Set Up an Rsync Daemon on Your Linux Server

    Introduction This tutorial will take you through setting up an rsync daemon on your Linux server. Yo ...

  5. UI设计:掌握这6点,轻松0到1

    非科班出身能成为UI设计师吗? 答案是肯定的.世上无难事,只怕有心人.只要找对方法.坚持不懈,即便是零基础也能学好UI设计. 那么零基础学习UI设计,需要学习哪些知识?我们要从哪些地方学起?怎么系统学 ...

  6. c++11日志练习

    /************************************************************** 技术博客  http://www.cnblogs.com/itdef/ ...

  7. socketpair初识

    #include <stdio.h>  #include <string.h>  #include <unistd.h>  #include <sys/typ ...

  8. Eclipse 中 Could not find *.apk的解决方案

    Eclipse 中 Could not find *.apk的解决方案 有时候debug的时候出现Could not find *.apk 特别是导入别人的例子的时候 1.选择properties-& ...

  9. div和span元素的区别

    2个都是用来划分区间但是没有实际语义的标签,差别就在于div是块级元素,不会其他元素在同一行;span是内联元素,可以与其他元素位于同一行. DIV 和 SPAN 元素最大的特点是默认都没有对元素内的 ...

  10. Reverse string using recursion

    On-Site Question 3 - SOLUTION Question Given a string, write a function that uses recursion to rever ...