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

Abp学习笔记(一)

程序员文章站 2022-03-24 12:21:29
Application Services Application Services are used to expose domain logic to the presentation layer. An Application Service is called from the present ......

application services

application services are used to expose domain logic to the presentation layer. an application service is called from the presentation layer using a dto (data transfer object) as a parameter. it also uses domain objects to perform some specific business logic and returns a dto back to the presentation layer. thus, the presentation layer is completely isolated from domain layer.

application services用于将域逻辑公开给表示层。使用dto(数据传输对象)作为参数从表示层调用应用服务。它还使用域对象来执行某些特定的业务逻辑,并将dto返回给表示层。因此,表示层与域层完全隔离。

在理想的分层应用程序中,表示层永远不会直接使用域对象。

iapplicationservice:

空接口,起到标识作用。所有实现了iapplicationservice 的类都会被自动注入到容器中。所有iapplicationservice对象都会被注入一些拦截器(例如:auditing, unitofwork等)以实现aop

applicationservice:

作为所有其他appservice的基类。其封装了对abpsession, permission和feature这些模块的功能调用.

iasynccrudappservice 和 asynccrudappservice

icrudappservice 和 crudappservice

一个是接口 一个是接口的实现,字面上就可以猜测出意思,大概就是自动实现了 异步增删改查,同步增删改查。也就是说 我们的接口继承自它们 就可以实现增删改查
官方给的解释:
if you need to create an application service that will have create, update, delete, get, getall methods for a specific entity,
you can easily inherit from the crudappservice class. you could also use the asynccrudappservice class to create async methods. the crudappservice base class is generic, which gets the related entity and dto types as generic arguments. this is also extensible, allowing you to override functionality when you need to customize it.
如果需要创建具有create,update,delete,get,getall方法的应用程序服务,则可以轻松地从crudappservice类继承。您还可以使用asynccrudappservice类来创建异步方法。crudappservice基类是通用的,它将相关的entity和 dto类型作为泛型参数。这也是可扩展的,允许您在需要自定义时覆盖功能。
此时:testappservice 就具有 create, update, delete, get, getall 等方法了。

public class testappservice : asynccrudappservice<test, testdto>
{
    public taskappservice(irepository<task> repository) 
        : base(repository)
    {

    }
}

同时,abp还会自动为我们创建控制器,因为在web.core的module的preinitialize方法中,有这样一段方法,自动会为实现了 applicationservice 的创建控制器,所以运行项目swagger上有xxxxservice 不用惊讶

  configuration.modules.abpaspnetcore()
                 .createcontrollersforappservices(
                     typeof(blogapplicationmodule).getassembly()
                 );

但是我们的testappservice 明明实现的是 asynccrudappservice ,追过去看继承链就知道了,最后还是继承自applicationservice

 public abstract class crudappservicebase<tentity, tentitydto, tprimarykey, tgetallinput, tcreateinput, tupdateinput> : applicationservice
        where tentity : class, ientity<tprimarykey>
        where tentitydto : ientitydto<tprimarykey>
        where tupdateinput : ientitydto<tprimarykey>

crud permissions

如果想要对c r u d 方法 增加权限的话,可以这样写。

public class testappservice : asynccrudappservice<test, testdto>
{
    public taskappservice(irepository<task> repository) 
        : base(repository)
    {
        createpermissionname = "your permission name";
    }
}

其中 createpermissionname 是 crudappservicebase(asynccrudappservice是它子类) 中定义的,其中还有 updatepermissionname deletepermissionname getallpermissionname getpermissionname

授权

上面说到了,权限问题,那么怎么创建权限呢?
很简单
在我们的项目中,xxx.core 也就是领域层下有个文件夹,authorization, 文件夹下有个 xxxauthorizationprovider.cs 的类文件
打开 可以看的

    public class blogauthorizationprovider : authorizationprovider
    {
        public override void setpermissions(ipermissiondefinitioncontext context)
        {
            context.createpermission(permissionnames.pages_users, l("users"));
            context.createpermission(permissionnames.pages_roles, l("roles"));
            context.createpermission(permissionnames.pages_tenants, l("tenants"), multitenancysides: multitenancysides.host);
            context.createpermission(permissionnames.article_create, l("articlecreate"));//这个是我自己添加的权限。
             //第一个参数 是我们程序里需要的权限名称
             //第一个参数 是display name 也就是我们后台系统里看到的名字
        }

        private static ilocalizablestring l(string name)
        {
            return new localizablestring(name, blogconsts.localizationsourcename);
        }
    }

permissionnames是什么呢?

    public static class permissionnames
    {
        public const string pages_tenants = "pages.tenants";

        public const string pages_users = "pages.users";

        public const string pages_roles = "pages.roles";
        public const string article_create = "article.create";

    }

其实 就是个静态类,里面定义了许多常量 也就是我们权限的名称

如果我们想使用的话,有以下四个属性:

  • 在application 层中,我们使用 abp.authorization.abpauthorize属性。
  • 在mvc控制器(web层)中,我们使用 abp.web.mvc.authorization.abpmvcauthorize属性。
  • 在asp.net web api中,我们使用 abp.webapi.authorization.abpapiauthorize属性。
  • 在asp.net core中,我们使用 abp.aspnetcore.mvc.authorization.abpmvcauthorize属性。
    [abpauthorize("your permissions")]