增加BasicConventionRegister, 在這里只是添加這種 基本的注冊方式,翻譯的不好有點擾,其主要是告訴Ioc在后面的注冊的時候關注三種類型
ITransientDependency
ISingletonDependency
IInterceptor
意味著只要你定義的類加了上面任意一個接口,就會被Abp的框架自動注冊到Ioc,
但是這里只是告訴Ioc有這種注冊方式,真正的注冊并不是在這里。
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.
DisableValidationAttribute, 僅可添加在方法上面
非Public方法
參數為空
驗證失敗會拋出: AbpValidationException異常,并帶有驗證失敗的詳細字段及錯誤信息
最后如果參數里面的某個屬性定義添加了IShouldNormalize接口,還會調用IShouldNormalize的Normalize方法,做一些數據規范化的操作,目前還沒想出來有啥用。
其針對所有的Ioc里面的對象,這個攔截器攔截的要素有2點:
a. 類上有RequiresFeatureAttribute
b. 類里面的某個某個方法有RequiresFeatureAttribute
這個看起來像一個比較通用的功能性的檢查,應該是為一個小的擴展功能存在的, 目前沒用到,暫時忽略.
審計攔截器,很有用的數據攔截, 其主要作用就是記錄攔截到的方法調用的數據。
攔截規則:
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的選擇器, 我們緊接著可以看到下面的代碼:
也只是針對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)。
審計日志的保存:
Uow的攔截注冊
可以看到默認情況下攔截兩種:
1. 所有有IRepository接口跟IApplicationService的類
2. 所有的加了UnitOfWorkAttribute的方法
這個可以實現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: 緩存策略設置
新聞熱點
疑難解答