コード例 #1
0
        public Func <object, object> GetInstanceFactory(Type @interface, Type targetType)
        {
            var key = new Tuple <Type, Type>(@interface, targetType);

            _instanceLock.EnterReadLock();
            try
            {
                if (_instanceFactories.TryGetValue(key, out var factory))
                {
                    return(factory);
                }
            }
            finally
            {
                _instanceLock.ExitReadLock();
            }
            _instanceLock.EnterWriteLock();
            try
            {
                if (_instanceFactories.TryGetValue(key, out var factory))
                {
                    return(factory);
                }
                var context   = new CodeGenerationContext(@interface, targetType, _interceptorResolver.GetInterceptors(@interface, targetType));
                var proxyType = _codeGeneratorFactory.Create().GenerateInterceptableProxyClass(context);
                return(_instanceFactories[key] = CreateInstanceFactory(proxyType));
            }
            finally
            {
                _instanceLock.ExitWriteLock();
            }
        }
コード例 #2
0
        private static Type GetInterceptableProxyType(
            ICodeGeneratorFactory codeGeneratorFactory,
            IInterceptorResolver interceptorResolver,
            Type serviceType,
            Type implementationType)
        {
            var interceptors = serviceType.IsInterface
                ? interceptorResolver.GetInterceptors(serviceType, implementationType)
                : interceptorResolver.GetInterceptors(implementationType);
            var codeGenerator = codeGeneratorFactory.Create();
            var context       = new CodeGenerationContext(serviceType, implementationType, interceptors);
            var proxyType     = codeGenerator.GenerateInterceptableProxyClass(context);

            return(proxyType);
        }
コード例 #3
0
        public ServiceDescriptorConverter(
            ServiceDescriptor serviceDescriptor,
            IInterceptorResolver interceptorResolver,
            IInterceptableProxyFactoryCache factoryCache,
            ICodeGeneratorFactory codeGeneratorFactory)
        {
            Guard.ArgumentNotNull(serviceDescriptor, nameof(serviceDescriptor));
            Guard.ArgumentNotNull(interceptorResolver, nameof(interceptorResolver));
            Guard.ArgumentNotNull(factoryCache, nameof(factoryCache));

            if (serviceDescriptor.ImplementationInstance != null || serviceDescriptor.ImplementationFactory != null || serviceDescriptor.IsInterceptable())
            {
                _primaryDescriptor = serviceDescriptor;
                return;
            }
            var serviceType        = serviceDescriptor.ServiceType;
            var implementationType = serviceDescriptor.ImplementationType;
            var lifetime           = serviceDescriptor.Lifetime;

            if (serviceType.IsInterface)
            {
                var interceptors = interceptorResolver.GetInterceptors(serviceType, implementationType);
                if (interceptors.IsEmpty)
                {
                    _primaryDescriptor = new ServiceDescriptor(serviceType, implementationType, lifetime);
                }
                else if (serviceType.IsGenericTypeDefinition)
                {
                    _secondaryDescriptor = new ServiceDescriptor(implementationType, implementationType, lifetime);
                    var codeGenerator = codeGeneratorFactory.Create();
                    var context       = new CodeGenerationContext(serviceType, implementationType, interceptors);
                    var proxyType     = codeGenerator.GenerateInterceptableProxyClass(context);
                    _primaryDescriptor = new ServiceDescriptor(serviceType, proxyType, lifetime);
                }
                else
                {
                    _primaryDescriptor = new ServiceDescriptor(serviceType, CreateOrGet, lifetime);
                    object CreateOrGet(IServiceProvider serviceProvider)
                    {
                        var target = ActivatorUtilities.CreateInstance(serviceProvider, implementationType);

                        return(factoryCache.GetInstanceFactory(serviceType, implementationType).Invoke(target));
                    }
                }
            }
            else
            {
                var interceptors = interceptorResolver.GetInterceptors(implementationType);
                if (interceptors.IsEmpty)
                {
                    _primaryDescriptor = new ServiceDescriptor(serviceType, implementationType, lifetime);
                }
                else
                {
                    var codeGenerator = codeGeneratorFactory.Create();
                    var context       = new CodeGenerationContext(implementationType, interceptors);
                    var proxyType     = codeGenerator.GenerateInterceptableProxyClass(context);
                    _primaryDescriptor = new ServiceDescriptor(serviceType, proxyType, lifetime);
                }
            }
        }