Esempio n. 1
0
        bool CanHandle(ObjectRequestedEventArgs args, out OpenGenericRegistrationData registrationData, out Type[] genericArgs)
        {
            genericArgs      = null;
            registrationData = null;

            var contractType = args.ContractType;

            if (!contractType.IsGenericType)
            {
                return(false);
            }

            var openGenericContractType = contractType.GetGenericTypeDefinition();

            if (openGenericContractType == null)
            {
                throw new ImpossibleException();
            }

            if (!_openContract2OpenConcrete.TryGetValue(openGenericContractType, out registrationData))
            {
                return(false);
            }

            // check the generic constraints???
            genericArgs = contractType.GetGenericArguments();
            return(true);
        }
 bool HandleObjectBuilderRequest(ObjectRequestedEventArgs args)
 {
     ObjectBuilderRequested.Invoke(args);
     if (!args.Handled)
     {
         return(false);
     }
     args.CommitRegistrations();
     return(true);
 }
Esempio n. 3
0
        public void OnObjectRequested(ObjectRequestedEventArgs args)
        {
            Type[] genericArgs;
            OpenGenericRegistrationData registrationData;

            if (!CanHandle(args, out registrationData, out genericArgs))
            {
                return;
            }
            RegisterNewService(args, registrationData, genericArgs);
        }
        bool TryGetCore(Type contract, IInjectionTargetInfo targetInfo, out ObjectBuilderGroup group, out List <ObjectBuilder> builders)
        {
            var key = GetKey(contract);

            _operationLock.EnterReadLock();
            try
            {
                if (_key2Groups.TryGetValue(key, out group))
                {
                    builders = targetInfo != null
                        ? group.GetAllValid(targetInfo)
                        : group.GetAllValid();

                    if (builders != null)
                    {
                        return(true);
                    }
                }
            }
            finally
            {
                _operationLock.ExitReadLock();
            }

            var args = new ObjectRequestedEventArgs(_kernel, contract, targetInfo);

            if (!HandleObjectBuilderRequest(args))
            {
                builders = null;
                return(false);
            }

            _operationLock.EnterReadLock();
            try
            {
                if (group == null && !_key2Groups.TryGetValue(key, out group))
                {
                    builders = null;
                    return(false);
                }
                builders = targetInfo != null
                    ? group.GetAllValid(targetInfo)
                    : group.GetAllValid();

                return(builders != null);
            }
            finally
            {
                _operationLock.ExitReadLock();
            }
        }
        ObjectBuilderState TryGetCore(Type contract, IInjectionTargetInfo targetInfo, out ObjectBuilderGroup group, out ObjectBuilder builder)
        {
            var result = ObjectBuilderState.Unregistered;
            var key    = GetKey(contract);

            _operationLock.EnterReadLock();
            try
            {
                if (_key2Groups.TryGetValue(key, out group))
                {
                    result = targetInfo != null
                        ? group.TryGetFirstValid(targetInfo, out builder)
                        : group.TryGetFirstValid(out builder);

                    if (result == ObjectBuilderState.Normal)
                    {
                        return(result);
                    }
                }
            }
            finally
            {
                _operationLock.ExitReadLock();
            }

            var args = new ObjectRequestedEventArgs(_kernel, contract, targetInfo);

            if (!HandleObjectBuilderRequest(args))
            {
                builder = null;
                return(result);
            }

            _operationLock.EnterReadLock();
            try
            {
                if (group == null && !_key2Groups.TryGetValue(key, out group))
                {
                    builder = null;
                    return(result);
                }
                return(targetInfo != null
                    ? group.TryGetFirstValid(targetInfo, out builder)
                    : group.TryGetFirstValid(out builder));
            }
            finally
            {
                _operationLock.ExitReadLock();
            }
        }
Esempio n. 6
0
        static RegistrationProvider CreateRegistrationProvider(ObjectRequestedEventArgs args, OpenGenericRegistrationData registrationData, Type[] genericArgs)
        {
            var registrationProviderType =
                typeof(ReflectionOrEmitRegistrationProvider <>).MakeGenericType(args.ContractType);

            TypedRegistrationProvider provider;

            try
            {
                var objProvider = Activator.CreateInstance(registrationProviderType, args.Kernel);
                provider = objProvider as TypedRegistrationProvider;
                if (provider == null)
                {
                    throw new ImpossibleException();
                }
            }
            catch (TargetInvocationException ex)
            {
                throw ex.InnerException;
            }

            provider.ActivatorKind = registrationData.ActivatorKind;
            provider.ContractType  = registrationData.OpenGenericContractType.MakeGenericType(genericArgs);
            provider.ConcreteType  = registrationData.OpenGenericConcreteType.MakeGenericType(genericArgs);

            if (registrationData.ConstructorSelector != null)
            {
                provider.ConstructorSelector = registrationData.ConstructorSelector;
            }
            if (registrationData.ConfiguredParameters != null)
            {
                provider.ConfiguredParameters = registrationData.ConfiguredParameters;
            }
            if (registrationData.LifetimeProvider != null)
            {
                provider.LifetimeProvider = registrationData.LifetimeProvider;
            }

            return(provider);
        }
Esempio n. 7
0
        static void RegisterNewService(ObjectRequestedEventArgs args, OpenGenericRegistrationData registrationData, Type[] genericArgs)
        {
            var provider = CreateRegistrationProvider(args, registrationData, genericArgs);

            args.Register(provider);
        }