【愚公系列】2022年03月 .NET架构班 021-ABP vNext 动态代理模块

举报
愚公搬代码 发表于 2022/03/12 02:22:46 2022/03/12
【摘要】 前言abp的拦截器实现是基于Autofac.Extras.DynamicProxy,这个包依赖两个组件:Autofac、Castle.Core(实质上是调用内部组件DynamicProxy实现动态代理) 1.Autofac概念基本概念Autofac 是一款.NET IoC 容器 . 它管理类之间的依赖关系, 从而使 应用在规模及复杂性增长的情况下依然可以轻易地修改 . 它的实现方式是将常规...

前言

abp的拦截器实现是基于Autofac.Extras.DynamicProxy,这个包依赖两个组件:Autofac、Castle.Core(实质上是调用内部组件DynamicProxy实现动态代理)

1.Autofac概念

基本概念

Autofac 是一款.NET IoC 容器 . 它管理类之间的依赖关系, 从而使 应用在规模及复杂性增长的情况下依然可以轻易地修改 . 它的实现方式是将常规的.net类当做 组件 处理.

注册组件

在应用启动的地方, 你需要添加一个 ContainerBuilder 并且通过它注册你的 组件 . 组件 可以是一个表达式, .NET 类型, 或者其他暴露一个或多个 服务 的一段代码, 同时它也可以引入其他的 依赖 .我们通过创建 ContainerBuilder 来注册 组件 并且告诉容器哪些 组件 暴露了哪些 服务.

解析服务

在 注册完组件并暴露相应的服务后, 你可以从创建的容器或其子 生命周期 中解析服务. 有时在我们的应用中也许可以从根容器中解析组件, 然而这么做有可能会导致内存泄漏.

生命周期

生命周期作用域是可释放的并且追踪组件的释放, 因此确保你总是调用了 “Dispose()”" 或者把它们包裹在 “using” 语句内.

2.Castle概念

Castle是针对.NET平台下的一个非常优秀的开源项目,从数据访问框架 ORM到依赖注入容器,再到WEB层的MVC框架、AOP,基本包括了整个开发过程中的所有东西,为我们快速的构建企业级的应用程序提供了很好的服务。

一、动态代理模块

1.EBusiness.Domain.Shared

日志特性和拦截器

/// <summary>
/// 邮件拦截器
/// </summary>
[Dependency(ServiceLifetime.Transient)]
public class LogInterceptor : AbpInterceptor
{
    public override async Task InterceptAsync(IAbpMethodInvocation invocation)
    {
        Console.WriteLine("方法操作前日志");
        await invocation.ProceedAsync();
        Console.WriteLine("方法操作后日志");
    }
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class LogAttribute : Attribute
{
    /// <summary>
    /// Creates a new instance of <see cref="LogAttribute"/> class.
    /// </summary>
    /// <param name="features">A list of features to be checked if they are enabled</param>
    public LogAttribute()
    {
       
    }
}

EBusinessDomainSharedModule配置动态代理

public override void PreConfigureServices(ServiceConfigurationContext context)
{
    EBusinessGlobalFeatureConfigurator.Configure();
    EBusinessModuleExtensionConfigurator.Configure();

    // 注册拦截器(AOP)对IOC的类进行代理
    context.Services.OnRegistred(options => {
        if (options.ImplementationType.IsDefined(typeof(LogAttribute), true))
        {
            options.Interceptors.TryAdd<LogInterceptor>();
        }
    });
}

2.使用

[log]
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。