private static IRegistrationBuilder <TLimit, TActivatorData, TRegistrationStyle> InvokeRegistrationActions <TLimit, TActivatorData, TRegistrationStyle>( this IRegistrationBuilder <TLimit, TActivatorData, TRegistrationStyle> registrationBuilder, ServiceRegistrationActionList registrationActionList, Type serviceType, Type implementationType) where TActivatorData : ReflectionActivatorData { var serviceRegistredArgs = new OnServiceRegistredContext(serviceType, implementationType); foreach (var registrationAction in registrationActionList) { registrationAction.Invoke(serviceRegistredArgs); } if (serviceRegistredArgs.Interceptors.Any()) { registrationBuilder = registrationBuilder.AddInterceptors( registrationActionList, serviceType, serviceRegistredArgs.Interceptors ); } return(registrationBuilder); }
/// <summary> /// 调用传入 Action /// </summary> /// <typeparam name="TLimit"></typeparam> /// <typeparam name="TActivatorData"></typeparam> /// <typeparam name="TRegistrationStyle"></typeparam> /// <param name="registrationBuilder"></param> /// <param name="registrationActionList"></param> /// <param name="serviceType"></param> /// <param name="implementationType"></param> /// <returns></returns> private static IRegistrationBuilder <TLimit, TActivatorData, TRegistrationStyle> InvokeRegistrationActions <TLimit, TActivatorData, TRegistrationStyle>( this IRegistrationBuilder <TLimit, TActivatorData, TRegistrationStyle> registrationBuilder, ServiceRegistrationActionList registrationActionList, Type serviceType, Type implementationType) where TActivatorData : ReflectionActivatorData { // 构造上下文,以便去调用之前传入的 Action。 var serviceRegistredArgs = new OnServiceRegistredContext(serviceType, implementationType); foreach (var registrationAction in registrationActionList) { // 以审计日志拦截器为例,这里会调用在预加载方法传入的 AuditingInterceptorRegistrar.RegisterIfNeeded 方法。 registrationAction.Invoke(serviceRegistredArgs); } // 这里的 Interceptors 实际上就是 AuditingInterceptorRegistrar.RegisterIfNeeded 内部添加的拦截器。 if (serviceRegistredArgs.Interceptors.Any()) { registrationBuilder = registrationBuilder.AddInterceptors( registrationActionList, serviceType, serviceRegistredArgs.Interceptors ); } return(registrationBuilder); }
private void RegisterInterceptors(IServiceCollection services) { ServiceRegistrationActionList actionList = null; var serviceDescriptor = services.FirstOrDefault(d => d.ServiceType == typeof(ServiceRegistrationActionList)); if (serviceDescriptor != null) { actionList = (ServiceRegistrationActionList)serviceDescriptor.ImplementationInstance; } if (actionList == null) { actionList = new ServiceRegistrationActionList(); services.AddSingleton(actionList); } _container.Kernel.ComponentRegistered += (key, handler) => { var serviceType = handler.ComponentModel.Services.FirstOrDefault()?.GetTypeInfo(); if (serviceType == null) { return; } var implementationType = handler.ComponentModel.Implementation.GetTypeInfo(); if (implementationType == null) { return; } var serviceRegistredArgs = new OnServiceRegistredContext(serviceType, implementationType); foreach (var registrationAction in actionList) { registrationAction.Invoke(serviceRegistredArgs); } if (serviceRegistredArgs.Interceptors.Any()) { foreach (var interceptor in serviceRegistredArgs.Interceptors) { handler.ComponentModel.Interceptors.Add( new InterceptorReference(interceptor) ); } } }; }