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);
    }
예제 #2
0
    /// <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)
                            );
                    }
                }
            };
        }