[Asp.Net Core轻量级Aop解决方案]AspectCore Project 介绍

AspectCore Project 介绍

什么是AspectCore Project ?

AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect-oriented programming) 解决方案,它更好的遵循Asp.Net Core的模块化开发理念,使用AspectCore可以更容易构建低耦合、易扩展的Web应用程序。

为什么要设计AspectCore ?

在传统.Net Framework和Asp.Net Framework中,我们使用Castle DynamicProxy 或者CLR提供的 Remoting.Proxies 可以轻松的实现 Aop 来分离关注点从而降低业务逻辑和基础框架功能的耦合。然而在Asp.Net Core中,不仅缺乏细粒度的Aop支持(MiddlewareFilter都是Asp.Net Core的内置Aop实现,但仅适合在Web层使用),Castle也迟迟未能友好的支持Asp.Net Core。

因此 AspectCore 提供了一个全新的轻量级和模块化的Aop解决方案,下面是AspectCore的基本特性:

  • 提供抽象的Aop接口,基于该接口,可以轻松的使用自己的代理类实现替换默认的实现

  • 框架不包含IoC,也不依赖具体的IoC实现,可以使用Asp.Net Core的内置依赖注入或任何兼容 Asp.Net Core的第三方IoC来集成 AspectCore 到 Asp.Net Core 应用程序中

  • 高性能的异步拦截器系统

  • 灵活的配置系统

  • 基于Service的而非基于实现类的切面构造

  • 支持跨平台的Asp.Net Core环境

AspectCore Project 架构设计

从上图可以看出,AspectCore Abstractions 是AspectCore Project的核心,向下通过IoC来集成到Asp.Net Core应用程序中,向上提供配置系统,动态代理系统,模型验证系统以及更多的扩展系统。

目前已完成的组件包括:

  • AspectCore.Lite.Abstractions 提供Aop的抽象接口

  • AspectCore.Lite.Abstractions.Resolution 默认的Aop实现

  • AspectCore.Lite.Container.DependencyInjection AspectCore的DependencyInjection支持

  • AspectCore.Lite.Container.Autofac AspectCore的Autofac支持

在Asp.Net Core应用程序中开始使用AspectCore

  1. 启动 Visual Studio。从 File 菜单, 选择 New > Project。选择 ASP.NET Core Web Application 项目模版,创建新的 ASP.NET Core Web Application 项目。

  2. 从 Nuget 安装 AspectCore.Lite.Container.DependencyInjection package:

    PM> Install-Package AspectCore.Lite.Container.DependencyInjection -Pre

    在拦截器系统中,AspectCore定义了IInterceptor接口,它声明了一个返回值为Task的异步执行方法:

    namespace AspectCore.Lite.Abstractions{public interface IInterceptor{    Task Invoke(IAspectContext context, AspectDelegate next);
    }
    }

    然而在一般情况下可以使用另一个抽象的InterceptorAttribute自定义特性类,它实现IInterceptor接口。AspectCore默认实现了基于Attribute的拦截器配置。我们的自定义拦截器看起来像下面这样:

    public class CustomInterceptorAttribute : InterceptorAttribute{public async

    override Task Invoke(IAspectContext context, AspectDelegate next)
    {  
      try{Console.WriteLine("Before service call");       
     
     await next(context);}    catch (Exception){Console.WriteLine("Service threw an exception!");    
     
        throw;}    finally{Console.WriteLine("After service call");}}
    }
  3. 定义ICustomService接口和它的实现类CustomService:

    public interface ICustomService{
    [CustomInterceptor]void Call();
    }public class CustomService : ICustomService{public void Call(){Console.WriteLine("service calling...");
    }
    }
  4. HomeController中注入ICustomService:

    public class HomeController : Controller{
    private readonly ICustomService _service;
    public HomeController(ICustomService service){_service = service;
    }public IActionResult Index(){_service.Call();    return View();
    }
    }
  5. 注册ICustomService,接着,在ConfigureServices中配置创建代理类型的容器:

    public IServiceProvider ConfigureServices(IServiceCollection services){
    services.AddTransient<ICustomService, CustomService>();
    services.AddMvc();
    return new AspectCoreServiceProviderFactory().CreateServiceProvider(services);
    }

    有问题反馈

    如果您有任何问题,请提交 Issue 给我们。
    AspectCore Project 项目地址: https://github.com/aspectcore
    AspectCore Project 文档地址: https://docs.aspectcore.org(文档在持续更新中..)

原文地址:http://www.cnblogs.com/liuhaoyang/p/aspectcore-introduction.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

放松眼球的网站

http://www.spielzeugz.de/html5/liquid-particles-3D/

java的BASE64Encoder,BASE64Decoder加密与解密

https://blog.csdn.net/weixin_44876457/article/details/89102723 https://blog.csdn.net/weixin_44876457/article/details/89102723 java的BASE64Encoder,BASE64Decoder加密与解密 package com.app.common;import java.io.ByteArrayOutputStream; import java.io.File; imp…

java各种集合的线程安全

转载自 java各种集合的线程安全 线程安全首先要明白线程的工作原理&#xff0c;jvm有一个main memory&#xff0c;而每个线程有自己的working memory&#xff0c;一个线程对一个variable进行操作时&#xff0c;都要在自己的working memory里面建立一个copy&#xff0c;操作完…

异步广度优先搜索算法

为什么要异步&#xff1f; CPU的工艺越来越小&#xff0c;Cannon Lake架构的Intel CPU已经达到10nm技术&#xff0c;因此在面积不变的情况下&#xff0c;核心数可以明显提升。单纯的提升主频将造成发热量大、需要的电压大、功耗大的问题。而传统的算法与数据结构是针对单核心单…

Servlet使用适配器模式进行增删改查案例(EmpServiceImpl.java)

/** * Title: EmpServiceImpl.java * Package org.service.impl * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-9-10 下午8:33:06 * version V1.0 */ package org.service.impl;import java.util.List;import org.da…

Java读取properties配置文件时,中文乱码解决方法

转载自 关于java.util.Properties读取中文乱码的正确解决方案&#xff08;不要再用native2ascii.exe了&#xff09; 碰到了用java.util.Properties读取中文内容&#xff08;UTF-8格式&#xff09;的配置文件&#xff0c;发生中文乱码的现象&#xff0c; Properties propnew Pro…

jQuery 所有版本在线引用

https://www.cnblogs.com/xpwi/p/9806663.html jQuery 所有版本在线引用 jquery-3.1.1&#xff08;最新&#xff09; 官网jquery压缩版引用地址:<script src"https://code.jquery.com/jquery-3.1.1.min.js"></script> jquery-3.0.0 官网jquery压缩版…

Servlet使用适配器模式进行增删改查案例(jdbc.properties)

driveroracle.jdbc.driver.OracleDriver urljdbc\:oracle\:thin\:localhost\:1521\:orcl1 usernamescott password123

怎么用java实现通过身份证号码判断籍贯所在地区

https://blog.csdn.net/weixin_43876206/article/details/89426036 怎么用java实现通过身份证号码判断籍贯所在地区 java实现通过身份证号码判断籍贯所在地区 目标&#xff1a;用户输入自己的身份证号码&#xff0c;通过所输入的身份证号码来判断出用户的籍贯、所在地区。 功…

java-- properties总结

转载自 java-- properties总结 篇章一&#xff1a;Loading Properties from XML XML 属性文档具有以下 DOCTYPE 声明&#xff1a; <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 注意&#xff0c;导入或导出属性时不 访问系统 URI…

开箱即用 - jwt 无状态分布式授权

基于JWT(Json Web Token)的授权方式 JWT 是JSON风格轻量级的授权和身份认证规范&#xff0c;可实现无状态、分布式的Web应用授权&#xff1b; 从客户端请求服务器获取token&#xff0c; 用该token 去访问实现了jwt认证的web服务器。 token 可保存自定义信息&#xff0c;如用户基…

List VS Set

Duang Duang Duang面试官来啦&#xff0c;快坐好&#xff0c;摆好姿势。 好了&#xff0c;我要开始提问了&#xff1a; 问&#xff1a;Set集合与List集合有什么区别呢&#xff1f; 答&#xff1a;Set集合中的数据不可重复&#xff0c;数据是无序的&#xff0c;List集合的数据可…

外部访问docker容器(docker run -p/-P 指令) docker run -d -p 5000:5000 {hostPort:containerPort(映射所有接口地}

https://www.cnblogs.com/williamjie/p/9915019.html &#xff08;2&#xff09;-p&#xff08;小写&#xff09;则可以指定要映射的IP和端口&#xff0c;但是在一个指定端口上只可以绑定一个容器。支持的格式有 hostPort:containerPort、ip:hostPort:containerPort、 ip::cont…

读取/书写Java的XML格式properties文件

转载自 读取/书写Java的XML格式properties文件 在JDK5中&#xff0c;properties文件的格式可以由XML构成&#xff0c;这里给出了一个读取/书写XML格式properties文件的例子。因为使用了XML&#xff0c;所以文件内容支持了CJKV(中文、日文、韩文、越南语)。可以直接书写、调用…

使用泛型前 VS 使用泛型后

不使用泛型&#xff1a; List list1 new ArrayList(); list1.add("www.educoder.net"); String str1 (String)list1.get(0);使用泛型&#xff1a; List<String> list2 new ArrayList<String>(); list2.add("www.educoder.net"); String s…

ssh报错java.lang.ClassCastException: com.sun.proxy.$Proxy6 cannot be cast to org.service.impl.EmpServi

错误如下&#xff1a; java.lang.ClassCastException: com.sun.proxy.$Proxy6 cannot be cast to org.service.impl.EmpServiceImpl at org.service.impl.EmpServiceImplTest.init(EmpServiceImplTest.java:44)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Metho…

去掉字符串后面所有的0 去掉字符串前面或后面的0;

https://blog.csdn.net/weixin_43844810/article/details/94577879 去掉字符串前面或后面的0&#xff1b; 养猫还是养狗&#xff1f; 2019-07-03 17:10:23 4492 收藏 1 分类专栏&#xff1a; 工作 版权 方法一&#xff1a; int a 0; //将油站编码前的0去掉 …

Java类加载器总结

转载自 Java类加载器总结 1.类的加载过程 JVM将类加载过程分为三个步骤&#xff1a;装载&#xff08;Load&#xff09;&#xff0c;链接&#xff08;Link&#xff09;和初始化(Initialize)链接又分为三个步骤&#xff0c;如下图所示&#xff1a; 1) 装载&#xff1a;查找并…

ssh根据姓名查询的时候报错java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!

错误如下&#xff1a; java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based! at org.hibernate.engine.query.ParameterMetadata.getOrdinalParameterDescriptor(ParameterMetadata.java:79)at org.hibernate.engine.query.ParameterMetadat…