zoukankan      html  css  js  c++  java
  • AbpKernelModule

    PreInitialize

    IocManager.AddConventionalRegistrar(new BasicConventionalRegistrar());

    增加BasicConventionRegister, 在这里只是添加这种 基本的注册方式,翻译的不好有点扰,其主要是告诉Ioc在后面的注册的时候关注三种类型

    ITransientDependency

    ISingletonDependency

    IInterceptor

    意味着只要你定义的类加了上面任意一个接口,就会被Abp的框架自动注册到Ioc,

    但是这里只是告诉Ioc有这种注册方式,真正的注册并不是在这里。

    ValidationInterceptorRegistrar.Initialize(IocManager);

    internal static class ValidationInterceptorRegistrar
    {
        public static void Initialize(IIocManager iocManager)
        {
            iocManager.IocContainer.Kernel.ComponentRegistered += Kernel_ComponentRegistered;
        }
    
        private static void Kernel_ComponentRegistered(string key, IHandler handler)
        {
            if (typeof(IApplicationService).IsAssignableFrom(handler.ComponentModel.Implementation))
            {
                handler.ComponentModel.Interceptors.Add(new InterceptorReference(typeof(ValidationInterceptor)));
            }
        }
    }

    这段代码很有意思, 其意思是说当Ioc中有组件被注册的时候(也就是往Ioc添加某个类型的时候), 检测该对象是否是IApplicationService(也就是只验证ApplicationService层), 是的话做Validation的拦截,可以做到拦截之后对ApplicationService层的方法参数做检测, Interceptors是一个拦截器集合, 可以加入更多的拦截器,比如方法调用日志监控横切面的操作。

    所以当一个请求进入ApplicationService层之后,第一个做的事情就是 Validation.

    跳过Validation的条件 :

    DisableValidationAttribute, 仅可添加在方法上面

    非Public方法

    参数为空

    验证失败会抛出: AbpValidationException异常,并带有验证失败的详细字段及错误信息

    最后如果参数里面的某个属性定义添加了IShouldNormalize接口,还会调用IShouldNormalize的Normalize方法,做一些数据规范化的操作,目前还没想出来有啥用。

    FeatureInterceptorRegistrar.Initialize(IocManager);

    其针对所有的Ioc里面的对象,这个拦截器拦截的要素有2点:

    a. 类上有RequiresFeatureAttribute

    b. 类里面的某个某个方法有RequiresFeatureAttribute

    这个看起来像一个比较通用的功能性的检查,应该是为一个小的扩展功能存在的, 目前没用到,暂时忽略.

    AuditingInterceptorRegistrar.Initialize(IocManager);

    审计拦截器,很有用的数据拦截, 其主要作用就是记录拦截到的方法调用的数据。

    拦截规则:

    private static bool ShouldIntercept(Type type)
    {
        if (_auditingConfiguration.Selectors.Any(selector => selector.Predicate(type)))
        {
            return true;
        }
    
        if (type.IsDefined(typeof(AuditedAttribute), true)) //TODO: true or false?
        {
            return true;
        }
    
        if (type.GetMethods().Any(m => m.IsDefined(typeof(AuditedAttribute), true))) //TODO: true or false?
        {
            return true;
        }
    
        return false;
    }

    可以看到除了第一条做了一个扩展规则之外,其余两条都是通过AuditedAttribute来处理的.

    关于Selectors的选择器, 我们紧接着可以看到下面的代码:

    image

    也只是针对IApplicationService层的方法做了审计拦截.

    至此应该明白 Abp的审计是如何做的了吧.

    但是看似这个功能很好,难免也会有特殊癖好的人思考如何关掉这么有用的功能, 看AuditingInterceptorRegistrar的类里面Initialize方法

    public static void Initialize(IIocManager iocManager)
    {
        _auditingConfiguration = iocManager.Resolve<IAuditingConfiguration>();
    
        if (!_auditingConfiguration.IsEnabled)
        {
            return;
        }
    
        iocManager.IocContainer.Kernel.ComponentRegistered += Kernel_ComponentRegistered;
    }

    写明了_auditingConfiguration.IsEnable来判断是否启用,但是这个方法本身就是在AbpKernel中执行的,请问在何处可以设置这个值呢?

    通过上篇的应用程序生命周期的分析,

    protected virtual void Application_Start(object sender, EventArgs e)
    {
        AbpBootstrapper.IocManager.RegisterIfNot<IAssemblyFinder, WebAssemblyFinder>();
        AbpBootstrapper.Initialize();
    }

    但是IAuditingConfiguration的注册及本方法的Init都是在Initizlize这个方法中,如果你使用的是非Abp的源代码,貌似没有办法做到关闭, 所以上面关闭Abp 默认Auditing功能的答案是否定的,待后续找作者处理(这个已联系作者处理: https://github.com/aspnetboilerplate/aspnetboilerplate/issues/721)。

    审计日志的保存:

    image

    UnitOfWorkRegistrar.Initialize(IocManager);

    Uow的拦截注册

    image

    image

    可以看到默认情况下拦截两种:

    1. 所有有IRepository接口跟IApplicationService的类

    2. 所有的加了UnitOfWorkAttribute的方法

    AuthorizationInterceptorRegistrar.Initialize(IocManager);

    这个可以实现Service层方法的授权检查, 没怎么用,忽略.

    其他
    Configuration.Settings.Providers.Add<EmailSettingProvider>();
    
    Configuration.UnitOfWork.RegisterFilter(AbpDataFilters.SoftDelete, true);
    Configuration.UnitOfWork.RegisterFilter(AbpDataFilters.MustHaveTenant, true);
    Configuration.UnitOfWork.RegisterFilter(AbpDataFilters.MayHaveTenant, true);
    
    ConfigureCaches();

    EmailSetting 邮件设置

    SoftDelete: 软删除设置

    MustHaveTenant: 多租户设置

    MayHaveTenant:

    Caches: 缓存策略设置

  • 相关阅读:
    UOJ 【UR #5】怎样跑得更快
    【TJOJIHEOI2016】求和
    CF 932E Team Work
    【BZOJ2159】Crash的文明世界
    Luogu P4707 重返现世
    Luogu P3175 [HAOI2015]按位或
    【BZOJ3930】选数
    nginx 学习
    如何解决 react-create-app 里面的 no-unused-vars ?
    随时更新web html 项目页面,查看手机等其他移动设备的几种方法?
  • 原文地址:https://www.cnblogs.com/feinian/p/4997718.html
Copyright © 2011-2022 走看看