Esempio n. 1
0
    private static IRegistrationBuilder <TLimit, TActivatorData, TRegistrationStyle> AddInterceptors <TLimit, TActivatorData, TRegistrationStyle>(
        this IRegistrationBuilder <TLimit, TActivatorData, TRegistrationStyle> registrationBuilder,
        ServiceRegistrationActionList serviceRegistrationActionList,
        Type serviceType,
        IEnumerable <Type> interceptors)
        where TActivatorData : ReflectionActivatorData
    {
        if (serviceType.IsInterface)
        {
            registrationBuilder = registrationBuilder.EnableInterfaceInterceptors();
        }
        else
        {
            if (serviceRegistrationActionList.IsClassInterceptorsDisabled)
            {
                return(registrationBuilder);
            }

            (registrationBuilder as IRegistrationBuilder <TLimit, ConcreteReflectionActivatorData, TRegistrationStyle>)?.EnableClassInterceptors();
        }

        foreach (var interceptor in interceptors)
        {
            registrationBuilder.InterceptedBy(
                typeof(AsyncDeterminationInterceptor <>).MakeGenericType(interceptor)
                );
        }

        return(registrationBuilder);
    }
Esempio n. 2
0
        public static IRegistrationBuilder <TLimit, TActivatorData, TRegistrationStyle> ConfigureAbpConventions <TLimit, TActivatorData, TRegistrationStyle>(
            this IRegistrationBuilder <TLimit, TActivatorData, TRegistrationStyle> registrationBuilder,
            IModuleContainer moduleContainer,
            ServiceRegistrationActionList registrationActionList)
            where TActivatorData : ReflectionActivatorData
        {
            var serviceType = registrationBuilder.RegistrationData.Services.OfType <IServiceWithType>().FirstOrDefault()?.ServiceType;

            if (serviceType == null)
            {
                return(registrationBuilder);
            }

            var implementationType = registrationBuilder.ActivatorData.ImplementationType;

            if (implementationType == null)
            {
                return(registrationBuilder);
            }

            registrationBuilder = registrationBuilder.EnablePropertyInjection(moduleContainer, implementationType);
            registrationBuilder = registrationBuilder.InvokeRegistrationActions(registrationActionList, serviceType, implementationType);

            return(registrationBuilder);
        }
Esempio n. 3
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 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>
        /// Configures the abp conventions.
        /// </summary>
        /// <typeparam name="TLimit">The type of the t limit.</typeparam>
        /// <typeparam name="TActivatorData">The type of the t activator data.</typeparam>
        /// <typeparam name="TRegistrationStyle">The type of the t registration style.</typeparam>
        /// <param name="registrationBuilder">The registration builder.</param>
        /// <param name="moduleContainer">The module container.</param>
        /// <param name="registrationActionList">The registration action list.</param>
        /// <returns>IRegistrationBuilder&lt;TLimit, TActivatorData, TRegistrationStyle&gt;.</returns>
        public static IRegistrationBuilder <TLimit, TActivatorData, TRegistrationStyle> ConfigureConventions <TLimit, TActivatorData, TRegistrationStyle>(
            this IRegistrationBuilder <TLimit, TActivatorData, TRegistrationStyle> registrationBuilder,
            IModuleContainer moduleContainer,
            ServiceRegistrationActionList registrationActionList)
            where TActivatorData : ReflectionActivatorData
        {
            var serviceType = registrationBuilder.RegistrationData.Services.OfType <IServiceWithType>().FirstOrDefault()?.ServiceType;

            if (serviceType == null)
            {
                return(registrationBuilder);
            }

            var implementationType = registrationBuilder.ActivatorData.ImplementationType;

            if (implementationType == null)
            {
                return(registrationBuilder);//没有实现指定类型(对应于ImplementationType属性)
            }
            //当前type程序集包含模块则开启属性注入
            registrationBuilder = registrationBuilder.EnablePropertyInjection(moduleContainer, implementationType);
            //调用registration HOOK  如果有拦截器,则添加拦截器
            registrationBuilder = registrationBuilder.InvokeRegistrationActions(registrationActionList, serviceType, implementationType);

            return(registrationBuilder);
        }
Esempio n. 6
0
        private void RegisterServices(ContainerBuilder builder, 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);
            }

            foreach (var service in services)
            {
                if (service.ImplementationType != null)
                {
                    // Test if the an open generic type is being registered
                    var serviceTypeInfo = service.ServiceType.GetTypeInfo();
                    if (serviceTypeInfo.IsGenericTypeDefinition)
                    {
                        builder
                        .RegisterGeneric(service.ImplementationType)
                        .As(service.ServiceType)
                        .ConfigureLifecycle(service.Lifetime)
                        .ConfigureConventions(actionList);
                    }
                    else
                    {
                        builder
                        .RegisterType(service.ImplementationType)
                        .As(service.ServiceType)
                        .ConfigureLifecycle(service.Lifetime)
                        .ConfigureConventions(actionList);
                    }
                }
                else if (service.ImplementationFactory != null)
                {
                    var registration = RegistrationBuilder.ForDelegate(service.ServiceType, (context, parameters) =>
                    {
                        var serviceProvider = context.Resolve <IServiceProvider>();
                        return(service.ImplementationFactory(serviceProvider));
                    })
                                       .ConfigureLifecycle(service.Lifetime)
                                       .CreateRegistration();
                    //TODO: ConfigureAbpConventions ?

                    builder.RegisterComponent(registration);
                }
                else
                {
                    builder
                    .RegisterInstance(service.ImplementationInstance)
                    .As(service.ServiceType)
                    .ConfigureLifecycle(service.Lifetime);
                }
            }
        }
    private static ServiceRegistrationActionList GetOrCreateRegistrationActionList(IServiceCollection services)
    {
        var actionList = services.GetSingletonInstanceOrNull <IObjectAccessor <ServiceRegistrationActionList> >()?.Value;

        if (actionList == null)
        {
            actionList = new ServiceRegistrationActionList();
            services.AddObjectAccessor(actionList);
        }
        return(actionList);
    }
        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)
                            );
                    }
                }
            };
        }
Esempio n. 9
0
        /// <summary>
        /// Registration service based on event
        /// </summary>
        public static void OnRegistred(this IServiceCollection services, Action <IOnServiceRegistredContext> registrationAction)
        {
            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);
            }
            actionList.Add(registrationAction);
        }