public object Locate(ExportActivationDelegate creationDelegate,
			IInjectionScope injectionScope,
			IInjectionContext injectionContext,
			IExportStrategy exportStrategy)
		{
			object returnValue = null;

			if (HttpContext.Current != null)
			{
				returnValue = HttpContext.Current.Items[uniqueId];
			}

			if (returnValue == null)
			{
				IDisposalScope disposalScope = injectionContext.DisposalScope;
				IInjectionScope requestingScope = injectionContext.RequestingScope;

				injectionContext.DisposalScope = MVCDisposalScopeProvider.GetDisposalScope();
				injectionContext.RequestingScope = exportStrategy.OwningScope;

				returnValue = creationDelegate(exportStrategy.OwningScope, injectionContext);

				injectionContext.DisposalScope = disposalScope;
				injectionContext.RequestingScope = requestingScope;

				if (returnValue != null && HttpContext.Current != null)
				{
					HttpContext.Current.Items[uniqueId] = returnValue;
				}
			}

			return returnValue;
		}
        public object Locate(ExportActivationDelegate creationDelegate,
			IInjectionScope injectionScope,
			IInjectionContext injectionContext,
			IExportStrategy exportStrategy)
        {
            IDictionary<object, object> items = OperationContext.Current.Items();
            object returnValue = items[uniqueRequestKey];

            if (returnValue == null)
            {
                IDisposalScope disposalScope = injectionContext.DisposalScope;
                IInjectionScope requestingScope = injectionContext.RequestingScope;

                injectionContext.DisposalScope = OperationContext.Current.DisposalScope();
                injectionContext.RequestingScope = exportStrategy.OwningScope;

                returnValue = creationDelegate(exportStrategy.OwningScope, injectionContext);

                injectionContext.DisposalScope = disposalScope;
                injectionContext.RequestingScope = requestingScope;

                if (returnValue != null)
                {
                    items[uniqueRequestKey] = returnValue;
                }
            }

            return returnValue;
        }
示例#3
0
        /// <summary>
        /// Condition meet
        /// </summary>
        /// <param name="scope">injection scope</param>
        /// <param name="injectionContext">injection context</param>
        /// <param name="exportStrategy">export strategy</param>
        /// <returns>condition</returns>
        public bool ConditionMeet(IInjectionScope scope, IInjectionContext injectionContext, IExportStrategy exportStrategy)
        {
            bool found = false;
            CurrentInjectionInfo[] injectionStack = injectionContext.GetInjectionStack();

            for (int i = injectionStack.Length - 1; i >= 0 && !found; i--)
            {
                CurrentInjectionInfo injectionInfo = injectionStack[i];

                foreach (Type ancestorType in ancestorTypes)
                {
                    if (ancestorType.GetTypeInfo().IsInterface)
                    {
                        if(injectionInfo.ActivationType == ancestorType ||
                            (injectionInfo.CurrentExportStrategy != null && injectionInfo.CurrentExportStrategy.ExportTypes.Contains(ancestorType)))
                        {
                            found = true;
                            break;
                        }
                    }
                    else if (injectionInfo.ActivationType == ancestorType)
                    {
                        found = true;
                        break;
                    }
                }
            }

            return found;
        }
        /// <summary>
        /// This method is called by the export strategy when attempting to locate an export
        /// </summary>
        /// <param name="creationDelegate"></param>
        /// <param name="exportStrategyScope"></param>
        /// <param name="injectionContext"></param>
        /// <param name="exportStrategy"></param>
        /// <returns></returns>
        public object Locate(ExportActivationDelegate creationDelegate,
			IInjectionScope exportStrategyScope,
			IInjectionContext injectionContext,
			IExportStrategy exportStrategy)
        {
            if (instance.Value != null)
            {
                return instance.Value;
            }

            IDisposalScope contextdisposalScope = injectionContext.DisposalScope;
            IInjectionScope requestingScope = injectionContext.RequestingScope;

            injectionContext.DisposalScope = exportStrategyScope;
            injectionContext.RequestingScope = exportStrategyScope;

            object instanceValue = creationDelegate(exportStrategyScope, injectionContext);

            injectionContext.DisposalScope = contextdisposalScope;
            injectionContext.RequestingScope = requestingScope;

            instance.Value = instanceValue;

            IDisposable disposable = instanceValue as IDisposable;

            if (disposable != null)
            {
                disposalScope.AddDisposable(disposable);
            }

            return instance.Value;
        }
示例#5
0
        /// <summary>
        /// Activate value
        /// </summary>
        /// <param name="exportInjectionScope">injection scope</param>
        /// <param name="context">injection context</param>
        /// <param name="consider">consider filter</param>
        /// <param name="locateKey"></param>
        /// <returns>activated value</returns>
        public object Activate(IInjectionScope exportInjectionScope, IInjectionContext context, ExportStrategyFilter consider, object locateKey)
        {
            string parameterName = ParameterName;

            if (context.TargetInfo == null)
            {
                throw new Exception("Must be injecting into type");
            }

            if (string.IsNullOrEmpty(parameterName))
            {
                parameterName = context.TargetInfo.InjectionTargetName;
            }

            string propertyString = HttpContext.Current.Request.QueryString[parameterName];

            if (context.TargetInfo.InjectionTargetType != typeof(string) && !string.IsNullOrEmpty(propertyString))
            {
                Type underlyingType = Nullable.GetUnderlyingType(context.TargetInfo.InjectionTargetType);

                if (underlyingType != null)
                {
                    return Convert.ChangeType(propertyString, underlyingType);
                }

                if (context.TargetInfo.InjectionTargetType.IsValueType)
                {
                    return Convert.ChangeType(propertyString, context.TargetInfo.InjectionTargetType);
                }

                throw new ArgumentException("You can only import ValueTypes or Nullable Types");
            }

            return propertyString;
        }
        /// <summary>
        /// Default constructor
        /// </summary>
        /// <param name="exportDelegateInfo"></param>
        /// <param name="activationDelegate"></param>
        /// <param name="exportStrategy"></param>
        /// <param name="owningScope"></param>
        public FuncCompiledExportDelegate(CompiledExportDelegateInfo exportDelegateInfo,
			ExportActivationDelegate activationDelegate,
			IExportStrategy exportStrategy,
			IInjectionScope owningScope)
            : base(exportDelegateInfo,exportStrategy, owningScope)
        {
            exportActivationDelegate = activationDelegate;
        }
示例#7
0
        public NavigationService(Frame frame, IInjectionScope injectionScope)
        {
            this.injectionScope = injectionScope;

            frameReference = frame != null ?
                                    new WeakReference<Frame>(frame) :
                                    new WeakReference<Frame>(ViewHelper.MainContent as Frame);
        }
示例#8
0
 public Binding(Type contractType, Type[] baseTypes, IInjectionFactory factory, IInjectionScope scope = null, Predicate<InjectionContext> condition = null)
 {
     ContractType = contractType;
     BaseTypes = baseTypes;
     Factory = factory;
     Scope = scope;
     Condition = condition;
 }
		public object Activate(IInjectionScope exportInjectionScope, IInjectionContext context, ExportStrategyFilter consider, object locateKey)
		{
			if (HttpContext.Current != null)
			{
				return HttpContext.Current.Request.Path;
			}

			return null;
		}
示例#10
0
        /// <summary>
        /// activate the strategy
        /// </summary>
        /// <param name="exportInjectionScope">injection scope</param>
        /// <param name="context">injection context</param>
        /// <param name="consider">consider filter</param>
        /// <param name="locateKey"></param>
        /// <returns>activated object</returns>
        public override object Activate(IInjectionScope exportInjectionScope, IInjectionContext context, ExportStrategyFilter consider, object locateKey)
        {
            if (_lifestyle != null)
            {
                return _lifestyle.Locate(InternalActivate, exportInjectionScope, context, this);
            }

            return InternalActivate(exportInjectionScope, context);
        }
示例#11
0
		public IDisposalScope ProvideDisposalScope(IInjectionScope injectionScope)
		{
			if (OperationContext.Current != null)
			{
				return OperationContext.Current.DisposalScope();
			}

			return injectionScope;
		}
 internal override void SetInstance(IInjectionScope scope, object instance)
 {
     if (!GetIsAlreadyResolved(scope))
     {
         _instancesPerScope.Add(scope, instance);
     }
     else
     {
         _instancesPerScope[scope] = instance;
     }
 }
        /// <summary>
        /// Activate the export
        /// </summary>
        /// <param name="exportInjectionScope"></param>
        /// <param name="context"></param>
        /// <param name="consider"></param>
        /// <param name="locateKey"></param>
        /// <returns></returns>
        public override object Activate(IInjectionScope exportInjectionScope, IInjectionContext context, ExportStrategyFilter consider, object locateKey)
        {
            object targetOject = strategy.Activate(exportInjectionScope, context, consider, locateKey);

            if (targetOject != null)
            {
                return propertyAccessor(targetOject);
            }

            return null;
        }
        /// <summary>
        /// This method is called by the export strategy when attempting to locate an export
        /// </summary>
        /// <param name="creationDelegate"></param>
        /// <param name="injectionScope"></param>
        /// <param name="injectionContext"></param>
        /// <param name="exportStrategy"></param>
        /// <returns></returns>
        public object Locate(ExportActivationDelegate creationDelegate,
			IInjectionScope injectionScope,
			IInjectionContext injectionContext,
			IExportStrategy exportStrategy)
        {
            if (lifestyleContainer == null)
            {
                lifestyleContainer = LocateContainer(exportStrategy.OwningScope, injectionContext);
            }

            return lifestyleContainer.Locate(creationDelegate, injectionScope, injectionContext, exportStrategy);
        }
示例#15
0
        /// <summary>
        /// Called to determine if the export strategy meets the condition to be activated
        /// </summary>
        /// <param name="scope">injection scope that this export exists in</param>
        /// <param name="injectionContext">injection context for this request</param>
        /// <param name="exportStrategy">export strategy being tested</param>
        /// <returns>true if the export meets the condition</returns>
        public bool ConditionMeet(IInjectionScope scope, IInjectionContext injectionContext, IExportStrategy exportStrategy)
        {
            foreach (IExportCondition exportCondition in exportConditions)
            {
                if (!exportCondition.ConditionMeet(scope, injectionContext, exportStrategy))
                {
                    return false;
                }
            }

            return true;
        }
示例#16
0
        /// <summary>
        /// Called to determine if the export strategy meets the condition to be activated
        /// </summary>
        /// <param name="scope">injection scope that this export exists in</param>
        /// <param name="injectionContext">injection context for this request</param>
        /// <param name="exportStrategy">export strategy being tested</param>
        /// <returns>true if the export meets the condition</returns>
        public bool ConditionMeet(IInjectionScope scope, IInjectionContext injectionContext, IExportStrategy exportStrategy)
        {
            if (injectionContext.TargetInfo != null)
            {
                foreach (Attribute injectionTypeAttribute in injectionContext.TargetInfo.InjectionTypeAttributes)
                {
                    if (injectionTypeAttribute.GetType().GetTypeInfo().IsAssignableFrom(attributeType.GetTypeInfo()))
                    {
                        return true;
                    }
                }
            }

            return false;
        }
        /// <summary>
        /// Called to determine if the export strategy meets the condition to be activated
        /// </summary>
        /// <param name="scope">injection scope that this export exists in</param>
        /// <param name="injectionContext">injection context for this request</param>
        /// <param name="exportStrategy">export strategy being tested</param>
        /// <returns>true if the export meets the condition</returns>
        public bool ConditionMeet(IInjectionScope scope, IInjectionContext injectionContext, IExportStrategy exportStrategy)
        {
            if (answer.HasValue)
            {
                return answer.Value;
            }

            bool returnValue = ConfigurationManager.AppSettings[settingName] == null;

            if (cacheAnswer)
            {
                answer = returnValue;
            }

            return returnValue;
        }
示例#18
0
        /// <summary>
        /// Called to determine if the export strategy meets the condition to be activated
        /// </summary>
        /// <param name="scope">injection scope that this export exists in</param>
        /// <param name="injectionContext">injection context for this request</param>
        /// <param name="exportStrategy">export strategy being tested</param>
        /// <returns>true if the export meets the condition</returns>
        public bool ConditionMeet(IInjectionScope scope, IInjectionContext injectionContext, IExportStrategy exportStrategy)
        {
            IInjectionTargetInfo targetInfo = injectionContext.TargetInfo;

            if (targetInfo != null && injectedType != null)
            {
                foreach (Type type in injectedType)
                {
                    if (targetInfo.InjectionType.GetTypeInfo().IsAssignableFrom(type.GetTypeInfo()))
                    {
                        return true;
                    }
                }
            }

            return false;
        }
示例#19
0
        /// <summary>
        /// returns true when the app.config setting is equal to the provided value
        /// </summary>
        /// <param name="scope"></param>
        /// <param name="injectionContext"></param>
        /// <param name="exportStrategy"></param>
        /// <returns></returns>
        public bool ConditionMeet(IInjectionScope scope, IInjectionContext injectionContext, IExportStrategy exportStrategy)
        {
            if (answer.HasValue)
            {
                return answer.Value;
            }

            string appSetting = ConfigurationManager.AppSettings[settingName];
            bool returnValue = false;

            if (appSetting != null)
            {
                if (settingValue == null)
                {
                    return false;
                }

                if (appSetting.GetType() == settingValue.GetType())
                {
                    returnValue = Equals(settingValue, appSetting);
                }

                try
                {
                    returnValue = Equals(settingValue, Convert.ChangeType(appSetting, settingValue.GetType()));
                }
                catch (Exception exp)
                {
                    Logger.Error(
                        string.Format("Exception thrown while converting {0} to {1}", appSetting, settingValue.GetType().FullName),
                        supplemental,
                        exp);
                }
            }
            else if (settingValue == null)
            {
                returnValue = true;
            }

            if (cacheAnswer)
            {
                answer = returnValue;
            }

            return returnValue;
        }
示例#20
0
        /// <summary>
        /// This method is called by the export strategy when attempting to locate an export
        /// </summary>
        /// <param name="creationDelegate"></param>
        /// <param name="exportStrategyScope"></param>
        /// <param name="injectionContext"></param>
        /// <param name="exportStrategy"></param>
        /// <returns></returns>
        public object Locate(ExportActivationDelegate creationDelegate,
			IInjectionScope exportStrategyScope,
			IInjectionContext injectionContext,
			IExportStrategy exportStrategy)
        {
            object returnValue = null;

            if (intanceRef != null)
            {
                returnValue = intanceRef.Target;
            }

            if (returnValue == null)
            {
                lock (lockObject)
                {
                    if (intanceRef != null)
                    {
                        returnValue = intanceRef.Target;
                    }

                    if (returnValue == null)
                    {
                        IDisposalScope disposalScope = injectionContext.DisposalScope;
                        IInjectionScope requeInjectionScope = injectionContext.RequestingScope;

                        // null scope because weak exports can't have
                        injectionContext.DisposalScope = null;
                        injectionContext.RequestingScope = exportStrategyScope;

                        returnValue = creationDelegate(exportStrategyScope, injectionContext);

                        injectionContext.DisposalScope = disposalScope;
                        injectionContext.RequestingScope = requeInjectionScope;

                        if (returnValue != null)
                        {
                            intanceRef = new WeakReference(returnValue);
                        }
                    }
                }
            }

            return returnValue;
        }
        /// <summary>
        /// This method is called by the export strategy when attempting to locate an export
        /// </summary>
        /// <param name="creationDelegate"></param>
        /// <param name="exportStrategyScope"></param>
        /// <param name="injectionContext"></param>
        /// <param name="exportStrategy"></param>
        /// <returns></returns>
        public object Locate(ExportActivationDelegate creationDelegate,
			IInjectionScope exportStrategyScope,
			IInjectionContext injectionContext,
			IExportStrategy exportStrategy)
        {
            object returnValue = injectionContext.RequestingScope.GetExtraData(uniqueId);

            if (returnValue == null)
            {
                IInjectionScope requestScope = injectionContext.RequestingScope;

                returnValue = creationDelegate(exportStrategyScope, injectionContext);

                requestScope.SetExtraData(uniqueId, returnValue);
            }

            return returnValue;
        }
示例#22
0
        /// <summary>
        /// Creates an instance in a singleton scope
        /// </summary>
        /// <param name="creationDelegate"></param>
        /// <param name="exportStrategyScope"></param>
        /// <param name="injectionContext"></param>
        /// <returns></returns>
        public static object CreateInSingletonScope(ExportActivationDelegate creationDelegate,
	        IInjectionScope exportStrategyScope,
	        IInjectionContext injectionContext)
        {
            object returnValue = null;

            IDisposalScope disposalScope = injectionContext.DisposalScope;
            IInjectionScope requestingScope = injectionContext.RequestingScope;

            injectionContext.DisposalScope = exportStrategyScope;
            injectionContext.RequestingScope = exportStrategyScope;

            returnValue = creationDelegate(exportStrategyScope, injectionContext);

            injectionContext.DisposalScope = disposalScope;
            injectionContext.RequestingScope = requestingScope;

            return returnValue;
        }
        /// <summary>
        /// This method is called by the export strategy when attempting to locate an export
        /// </summary>
        /// <param name="creationDelegate"></param>
        /// <param name="injectionScope"></param>
        /// <param name="injectionContext"></param>
        /// <param name="exportStrategy"></param>
        /// <returns></returns>
        public object Locate(ExportActivationDelegate creationDelegate,
			IInjectionScope injectionScope,
			IInjectionContext injectionContext,
			IExportStrategy exportStrategy)
        {
            object returnValue = injectionContext.GetExtraData(key);

            if (returnValue == null)
            {
                returnValue = creationDelegate(injectionScope, injectionContext);

                if (returnValue != null)
                {
                    injectionContext.SetExtraData(key, returnValue);
                }
            }

            return returnValue;
        }
        /// <summary>
        /// Called to determine if the export strategy meets the condition to be activated
        /// </summary>
        /// <param name="scope">injection scope that this export exists in</param>
        /// <param name="injectionContext">injection context for this request</param>
        /// <param name="exportStrategy">export strategy being tested</param>
        /// <returns>true if the export meets the condition</returns>
        public bool ConditionMeet(IInjectionScope scope, IInjectionContext injectionContext, IExportStrategy exportStrategy)
        {
            if (answer.HasValue)
            {
                return answer.Value;
            }

            string appSetting = ConfigurationManager.AppSettings[settingName];

            bool returnValue = string.IsNullOrEmpty(appSetting) ||
                               string.Compare("false", appSetting, StringComparison.CurrentCultureIgnoreCase) == 0;

            if (cacheAnswer)
            {
                answer = returnValue;
            }

            return returnValue;
        }
        public object Locate(ExportActivationDelegate creationDelegate,
            IInjectionScope injectionScope,
            IInjectionContext injectionContext,
            IExportStrategy exportStrategy)
        {
            object returnValue = null;
            IInjectionScope locateScope = FindNamedScope(injectionContext.RequestingScope);

            if (locateScope == null)
            {
                throw new InjectionScopeCouldNotBeFoundException(_namedScope);
            }

            returnValue = locateScope.GetExtraData(_uniqueId);

            if (returnValue != null)
            {
                return returnValue;
            }

            lock (_lockObject)
            {
                returnValue = locateScope.GetExtraData(_uniqueId) ??
                              SingletonLifestyle.CreateInSingletonScope(creationDelegate,
                                  locateScope,
                                  injectionContext);

                if (returnValue != null)
                {
                    locateScope.SetExtraData(_uniqueId, returnValue);

                    IDisposable disposable = returnValue as IDisposable;

                    if (disposable != null)
                    {
                        locateScope.AddDisposable(disposable);
                    }
                }
            }

            return returnValue;
        }
        /// <summary>
        /// ResolveAll will be called every time a collection is resolved
        /// </summary>
        /// <param name="owningScope"></param>
        /// <param name="context"></param>
        /// <param name="resolveName"></param>
        /// <param name="resolveType"></param>
        /// <param name="collectionEmpty"></param>
        /// <param name="consider"></param>
        /// <param name="locateKey"></param>
        /// <returns></returns>
        public IEnumerable<object> LocateAll(IInjectionScope owningScope, IInjectionContext context, string resolveName, Type resolveType, bool collectionEmpty, ExportStrategyFilter consider, object locateKey)
        {
            if (resolveType != null && resolveType.IsInterface && collectionEmpty)
            {
                Type createType = typeof(NSubstituteExportStrategy<>).MakeGenericType(resolveType);

                ICompiledExportStrategy newStrategy = Activator.CreateInstance(createType) as ICompiledExportStrategy;

                if (newStrategy != null)
                {
                    newStrategy.SetLifestyleContainer(new SingletonLifestyle());

                    newStrategy.AddExportType(resolveType);

                    owningScope.AddStrategy(newStrategy);

                    yield return newStrategy.Activate(owningScope, context, null, locateKey);
                }
            }
        }
示例#27
0
        /// <summary>
        /// Activate the export
        /// </summary>
        /// <param name="exportInjectionScope"></param>
        /// <param name="context"></param>
        /// <param name="consider"></param>
        /// <param name="locateKey"></param>
        /// <returns></returns>
        public override object Activate(IInjectionScope exportInjectionScope, IInjectionContext context, ExportStrategyFilter consider, object locateKey)
        {
            if (Log.IsDebugEnabled)
            {
                if (Lifestyle != null)
                {
                    Log.DebugFormat("Activating export type {0} with life cycle container {1} ",
                        ActivationType.FullName,
                        Lifestyle.GetType().FullName);
                }
                else
                {
                    Log.DebugFormat("Activating export type {0} with no life cycle container ",
                        ActivationType.FullName);
                }
            }

            try
            {
                if (_lifestyle != null)
                {
                    return _lifestyle.Locate(activationDelegate, exportInjectionScope, context, this);
                }

                return activationDelegate(exportInjectionScope, context);
            }
            catch (LocateException locateException)
            {
                locateException.AddLocationInformationEntry(new StrategyBeingActivated(this));

                throw;
            }
            catch (Exception exp)
            {
                GeneralLocateException locateException = new GeneralLocateException(null, (Type)null, context, exp);

                locateException.AddLocationInformationEntry(new StrategyBeingActivated(this));

                throw locateException;
            }
        }
        /// <summary>
        /// Locates an ILifestyle
        /// </summary>
        /// <param name="injectionScope"></param>
        /// <param name="injectionContext"></param>
        /// <returns></returns>
        private static ILifestyle LocateContainer(IInjectionScope injectionScope, IInjectionContext injectionContext)
        {
            ILifestyle returnValue = null;

            try
            {
                IPerRequestLifestyleProvider provider =
                    injectionScope.Locate<IPerRequestLifestyleProvider>(injectionContext);

                if (provider != null)
                {
                    returnValue = provider.ProvideContainer();
                }
            }
            catch (Exception exp)
            {
                Logger.Error("Exception throw while trying to locate IPerRequestLifestyleProvider", "SingletonPerRequest", exp);
            }

            return returnValue ?? new SingletonPerInjectionContextLifestyle();
        }
示例#29
0
 /// <summary>
 /// Default constructor
 /// </summary>
 /// <param name="injectionScope"></param>
 public LazyWrapperStrategy(IInjectionScope injectionScope) : base(typeof(Lazy <>), injectionScope)
 {
 }
示例#30
0
 /// <summary>
 /// Create expression that calls a delegate
 /// </summary>
 /// <param name="scope">scope for the request</param>
 /// <param name="request">activation request</param>
 /// <returns></returns>
 protected virtual IActivationExpressionResult CreateExpression(IInjectionScope scope,
                                                                IActivationExpressionRequest request)
 {
     return(ExpressionUtilities.CreateExpressionForDelegate(DelegateInstance, ShouldTrackDisposable(scope), scope, request, this));
 }
 /// <summary>
 /// Default constructor
 /// </summary>
 /// <param name="injectionScope"></param>
 public FuncOneArgWrapperStrategy(IInjectionScope injectionScope) : base(typeof(Func <,>), injectionScope)
 {
 }
示例#32
0
        /// <summary>
        /// Default Constructor
        /// </summary>
        /// <param name="injectionScope"></param>
        public InjectionScopeDiagnostics(IExportLocatorScope injectionScope)
        {
            _injectionScope = injectionScope.GetInjectionScope();

            ProcessInjectionDependencies();
        }
示例#33
0
 protected override void ConfigureApplicationContainer(IInjectionScope existingContainer)
 {
     ApplicationContainerConfigured = true;
     base.ConfigureApplicationContainer(existingContainer);
 }
        /// <summary>
        /// Default constructor
        /// </summary>
        /// <param name="activationType">type to activate</param>
        /// <param name="injectionScope">owning injection scope</param>
        protected ConfigurableActivationStrategy(Type activationType, IInjectionScope injectionScope)
        {
            ActivationConfiguration = new TypeActivationConfiguration(activationType, this);

            InjectionScope = injectionScope;
        }
        /// <summary>
        /// Creates decorated expression for activation strategy
        /// </summary>
        /// <param name="scope"></param>
        /// <param name="request"></param>
        /// <param name="strategy"></param>
        /// <param name="decorators"></param>
        /// <returns></returns>
        protected virtual IActivationExpressionResult CreateDecoratedActivationStrategy(IInjectionScope scope, IActivationExpressionRequest request, ICompiledExportStrategy strategy, List <ICompiledDecoratorStrategy> decorators)
        {
            decorators.Sort((x, y) => Comparer <int> .Default.Compare(x.Priority, y.Priority));

            var pathNodes = ImmutableLinkedList <IActivationPathNode> .Empty;

            if (decorators.All(d => d.ApplyAfterLifestyle))
            {
                pathNodes = pathNodes.Add(new DecoratorActivationPathNode(strategy, request.ActivationType, strategy.Lifestyle));

                foreach (var decorator in decorators)
                {
                    pathNodes = pathNodes.Add(new DecoratorActivationPathNode(decorator, request.ActivationType, null));
                }
            }
            else
            {
                pathNodes = pathNodes.Add(new DecoratorActivationPathNode(strategy, request.ActivationType, null));

                DecoratorActivationPathNode currentNode = null;

                foreach (var decorator in decorators.Where(d => !d.ApplyAfterLifestyle))
                {
                    currentNode = new DecoratorActivationPathNode(decorator, request.ActivationType, null);

                    pathNodes = pathNodes.Add(currentNode);
                }

                if (currentNode != null)
                {
                    currentNode.Lifestyle = strategy.Lifestyle;
                }

                foreach (var decorator in decorators.Where(d => d.ApplyAfterLifestyle))
                {
                    pathNodes = pathNodes.Add(new DecoratorActivationPathNode(decorator, request.ActivationType, null));
                }
            }

            request.SetDecoratorPath(pathNodes);

            var pathNode = request.PopDecoratorPathNode();

            return(pathNode.GetActivationExpression(scope, request));
        }
 /// <summary>
 /// Default constructor
 /// </summary>
 /// <param name="injectionScope"></param>
 public TypedActivationStrategyDelegateWrapperStrategy(IInjectionScope injectionScope) : base(typeof(TypedActivationStrategyDelegate <>), injectionScope)
 {
 }
 /// <summary>
 /// Default constructor
 /// </summary>
 /// <param name="owningScope"></param>
 /// <param name="strategyCreator"></param>
 public ExportRegistrationBlock(IInjectionScope owningScope, IActivationStrategyCreator strategyCreator)
 {
     _strategyCreator = strategyCreator;
     OwningScope      = owningScope;
 }
示例#38
0
 /// <summary>
 /// Default constructor
 /// </summary>
 /// <param name="activationType"></param>
 /// <param name="injectionScope"></param>
 /// <param name="builder"></param>
 public CompiledExportStrategy(Type activationType, IInjectionScope injectionScope, IDefaultStrategyExpressionBuilder builder) : base(activationType, injectionScope)
 {
     _builder = builder;
 }
示例#39
0
 /// <summary>
 /// Get an activation expression for this strategy
 /// </summary>
 /// <param name="scope"></param>
 /// <param name="request"></param>
 /// <param name="lifestyle"></param>
 /// <returns></returns>
 public IActivationExpressionResult GetDecoratorActivationExpression(IInjectionScope scope, IActivationExpressionRequest request, ICompiledLifestyle lifestyle)
 {
     return(_builder.GetActivationExpression(scope, request, ActivationConfiguration, lifestyle));
 }
示例#40
0
 /// <summary>
 /// Get an activation expression for this strategy
 /// </summary>
 /// <param name="scope"></param>
 /// <param name="request"></param>
 /// <returns></returns>
 public abstract IActivationExpressionResult GetActivationExpression(IInjectionScope scope, IActivationExpressionRequest request);
示例#41
0
 /// <summary>
 /// Default constructor
 /// </summary>
 /// <param name="activationType">type being activated</param>
 /// <param name="injectionScope">scope for strategy</param>
 protected BaseWrapperStrategy(Type activationType, IInjectionScope injectionScope) : base(activationType, injectionScope)
 {
 }
        /// <summary>
        /// Get a linq expression to satisfy the request
        /// </summary>
        /// <param name="scope">scope</param>
        /// <param name="request">request</param>
        /// <returns></returns>
        public virtual IActivationExpressionResult GetActivationExpression(IInjectionScope scope, IActivationExpressionRequest request)
        {
            var activationExpressionResult = GetValueFromRequest(scope, request, request.ActivationType, null);

            if (activationExpressionResult != null)
            {
                return(activationExpressionResult);
            }

            activationExpressionResult = GetValueFromInjectionValueProviders(scope, request);

            if (activationExpressionResult != null)
            {
                return(activationExpressionResult);
            }

            activationExpressionResult = GetActivationExpressionFromStrategies(scope, request);

            if (activationExpressionResult != null)
            {
                return(activationExpressionResult);
            }

            if (request.ActivationType.IsArray)
            {
                return(ArrayExpressionCreator.GetArrayExpression(scope, request));
            }

            if (request.ActivationType.IsConstructedGenericType &&
                request.ActivationType.GetGenericTypeDefinition() == typeof(IEnumerable <>))
            {
                return(EnumerableExpressionCreator.GetEnumerableExpression(scope, request, ArrayExpressionCreator));
            }

            var wrapperResult = WrapperExpressionCreator.GetActivationExpression(scope, request);

            if (wrapperResult != null)
            {
                return(wrapperResult);
            }

            if (scope.MissingExportStrategyProviders.Any())
            {
                lock (scope.GetLockObject(InjectionScope.ActivationStrategyAddLockName))
                {
                    activationExpressionResult = GetActivationExpressionFromStrategies(scope, request);

                    if (activationExpressionResult != null)
                    {
                        return(activationExpressionResult);
                    }

                    wrapperResult = WrapperExpressionCreator.GetActivationExpression(scope, request);

                    if (wrapperResult != null)
                    {
                        return(wrapperResult);
                    }

                    request.Services.Compiler.ProcessMissingStrategyProviders(scope, request);

                    activationExpressionResult = GetActivationExpressionFromStrategies(scope, request);

                    if (activationExpressionResult != null)
                    {
                        return(activationExpressionResult);
                    }

                    wrapperResult = WrapperExpressionCreator.GetActivationExpression(scope, request);

                    if (wrapperResult != null)
                    {
                        return(wrapperResult);
                    }
                }
            }

            var parent = scope.Parent as IInjectionScope;

            if (parent != null)
            {
                return(GetActivationExpression(parent, request));
            }

            return(GetValueFromInjectionContext(scope, request));
        }
示例#43
0
 /// <summary>
 /// Default constructor
 /// </summary>
 /// <param name="scope"></param>
 /// <param name="request"></param>
 /// <param name="activationStrategy"></param>
 public LazyExpression(IInjectionScope scope, IActivationExpressionRequest request, IActivationStrategy activationStrategy)
 {
     _scope              = scope;
     _request            = request;
     _activationStrategy = activationStrategy;
 }
示例#44
0
 /// <summary>
 /// Allow constructor selector to override method
 /// </summary>
 /// <param name="injectionScope"></param>
 /// <param name="configuration"></param>
 /// <param name="request"></param>
 /// <param name="constructor"></param>
 /// <param name="expression"></param>
 /// <returns></returns>
 protected virtual IActivationExpressionResult OverrideExpression(IInjectionScope injectionScope, TypeActivationConfiguration configuration, IActivationExpressionRequest request, ConstructorInfo constructor, IActivationExpressionResult expression)
 {
     return(expression);
 }
 internal static bool IsChild(this IInjectionScope container) => container.Parent != null;
示例#46
0
        /// <summary>
        /// Can the service be located
        /// </summary>
        /// <param name="injectionScope">injection scope</param>
        /// <param name="type">type to be located</param>
        /// <param name="filter">filter for locate</param>
        /// <param name="key">key to use for locate</param>
        /// <param name="includeProviders"></param>
        /// <returns></returns>
        public bool CanLocate(IInjectionScope injectionScope, Type type, ActivationStrategyFilter filter, object key = null, bool includeProviders = true)
        {
            if (key != null)
            {
                var collection = injectionScope.StrategyCollectionContainer.GetActivationStrategyCollection(type);

                if (collection?.GetKeyedStrategy(key) != null)
                {
                    return(true);
                }

                return(injectionScope.Parent?.CanLocate(type, filter, key) ?? false);
            }

            if (injectionScope.StrategyCollectionContainer.GetActivationStrategyCollection(type) != null)
            {
                return(true);
            }

            if (injectionScope.WrapperCollectionContainer.GetActivationStrategyCollection(type) != null)
            {
                return(true);
            }

            if (type.IsArray)
            {
                return(true);
            }

            if (type.IsConstructedGenericType)
            {
                var generic = type.GetGenericTypeDefinition();

                if (injectionScope.StrategyCollectionContainer.GetActivationStrategyCollection(generic) != null)
                {
                    return(true);
                }

                var collection = injectionScope.WrapperCollectionContainer.GetActivationStrategyCollection(generic);

                if (collection != null)
                {
                    foreach (var strategy in collection.GetStrategies())
                    {
                        var wrappedType = strategy.GetWrappedType(type);

                        if (CanLocate(injectionScope, wrappedType, filter))
                        {
                            return(true);
                        }
                    }
                }

                if (generic == typeof(IEnumerable <>))
                {
                    return(true);
                }
            }

            if (type == typeof(ILocatorService) ||
                type == typeof(IExportLocatorScope) ||
                type == typeof(IInjectionContext) ||
                type == typeof(IDisposalScope) ||
                type == typeof(StaticInjectionContext) ||
                (type == typeof(IDisposable) && injectionScope.ScopeConfiguration.InjectIDisposable))
            {
                return(true);
            }

            if (includeProviders)
            {
                var request = injectionScope.StrategyCompiler.CreateNewRequest(type, 0, injectionScope);

                foreach (var provider in injectionScope.InjectionValueProviders)
                {
                    if (provider.CanLocate(injectionScope, request))
                    {
                        return(true);
                    }
                }

                foreach (var provider in injectionScope.MissingExportStrategyProviders)
                {
                    if (provider.CanLocate(injectionScope, request))
                    {
                        return(true);
                    }
                }
            }

            return(injectionScope.Parent?.CanLocate(type, filter) ?? false);
        }
        private T GetStrategyFromCollection <T>(IActivationStrategyCollection <T> strategyCollection, IInjectionScope scope, ActivationStrategyFilter consider, Type locateType, IInjectionContext injectionContext) where T : IActivationStrategy
        {
            foreach (var strategy in strategyCollection.GetStrategies())
            {
                if (strategy.HasConditions)
                {
                    var pass = true;

                    foreach (var condition in strategy.Conditions)
                    {
                        if (!condition.MeetsCondition(strategy, new StaticInjectionContext(locateType)))
                        {
                            pass = false;
                            break;
                        }
                    }

                    if (!pass)
                    {
                        continue;
                    }
                }

                if (consider != null && !consider(strategy))
                {
                    continue;
                }

                return(strategy);
            }

            return(default(T));
        }
示例#48
0
 /// <summary>
 /// This method is called when there are multiple constructors
 /// </summary>
 /// <param name="injectionScope"></param>
 /// <param name="configuration"></param>
 /// <param name="request"></param>
 /// <param name="constructors"></param>
 /// <returns></returns>
 protected abstract ConstructorInfo PickConstructor(IInjectionScope injectionScope,
                                                    TypeActivationConfiguration configuration, IActivationExpressionRequest request, ConstructorInfo[] constructors);
 /// <summary>
 /// Default constructor
 /// </summary>
 /// <param name="activationType"></param>
 /// <param name="injectionScope"></param>
 public DelegateOneArgWrapperStrategy(Type activationType, IInjectionScope injectionScope) : base(activationType, injectionScope)
 {
 }
        /// <summary>
        /// Locate a strategy from collection containers
        /// </summary>
        /// <param name="scope"></param>
        /// <param name="locateType"></param>
        /// <param name="consider"></param>
        /// <param name="key"></param>
        /// <param name="injectionContext"></param>
        /// <returns></returns>
        protected virtual ActivationStrategyDelegate LocateStrategyFromCollectionContainers(IInjectionScope scope, Type locateType, ActivationStrategyFilter consider, object key, IInjectionContext injectionContext)
        {
            if (key != null)
            {
                return(FindKeyedDelegate(scope, locateType, consider, key));
            }

            var strategyCollection = scope.StrategyCollectionContainer.GetActivationStrategyCollection(locateType);

            if (strategyCollection != null)
            {
                var primary = consider == null?strategyCollection.GetPrimary() : null;

                if (primary != null)
                {
                    return(primary.GetActivationStrategyDelegate(scope, this, locateType));
                }

                var strategy = GetStrategyFromCollection(strategyCollection, scope, consider, locateType, injectionContext);

                if (strategy != null)
                {
                    return(strategy.GetActivationStrategyDelegate(scope, this, locateType));
                }
            }

            var isGeneric = locateType.IsConstructedGenericType;

            if (isGeneric)
            {
                var generic = locateType.GetGenericTypeDefinition();

                strategyCollection = scope.StrategyCollectionContainer.GetActivationStrategyCollection(generic);

                if (strategyCollection != null)
                {
                    var primary = consider == null?strategyCollection.GetPrimary() : null;

                    if (primary != null)
                    {
                        return(primary.GetActivationStrategyDelegate(scope, this, locateType));
                    }

                    var strategy = GetStrategyFromCollection(strategyCollection, scope, consider, locateType, injectionContext);

                    if (strategy != null)
                    {
                        return(strategy.GetActivationStrategyDelegate(scope, this, locateType));
                    }
                }
            }

            var wrapperCollection = scope.WrapperCollectionContainer.GetActivationStrategyCollection(locateType);

            if (wrapperCollection != null)
            {
                var primary = consider == null?wrapperCollection.GetPrimary() : null;

                if (primary != null)
                {
                    return(primary.GetActivationStrategyDelegate(scope, this, locateType));
                }

                var strategy = GetStrategyFromCollection(strategyCollection, scope, consider, locateType, injectionContext);

                if (strategy != null)
                {
                    return(strategy.GetActivationStrategyDelegate(scope, this, locateType));
                }
            }

            if (isGeneric)
            {
                var generic = locateType.GetGenericTypeDefinition();

                wrapperCollection = scope.WrapperCollectionContainer.GetActivationStrategyCollection(generic);

                if (wrapperCollection != null)
                {
                    var primary = consider == null?wrapperCollection.GetPrimary() : null;

                    if (primary != null)
                    {
                        return(primary.GetActivationStrategyDelegate(scope, this, locateType));
                    }

                    var strategy = GetStrategyFromCollection(strategyCollection, scope, consider, locateType, injectionContext);

                    if (strategy != null)
                    {
                        return(strategy.GetActivationStrategyDelegate(scope, this, locateType));
                    }
                }
            }

            return(null);
        }
示例#51
0
        /// <summary>
        /// Create member init expression
        /// </summary>
        /// <param name="scope">scope for configuration</param>
        /// <param name="request">request</param>
        /// <param name="activationConfiguration">activation configuration</param>
        /// <param name="result">result from instantation</param>
        /// <param name="newExpression">instantiation expression</param>
        /// <returns></returns>
        protected virtual IActivationExpressionResult CreateNewMemeberInitExpression(IInjectionScope scope, IActivationExpressionRequest request, TypeActivationConfiguration activationConfiguration, IActivationExpressionResult result, NewExpression newExpression)
        {
            var bindings = new List <MemberBinding>();

            var members = GetMemberInjectionInfoForConfiguration(scope, request, activationConfiguration);

            foreach (var memberKVP in members)
            {
                var expression = memberKVP.Value.CreateExpression;

                if (expression == null)
                {
                    var memberType = memberKVP.Key.GetMemeberType();

                    var newRequest =
                        request.NewRequest(memberType, activationConfiguration.ActivationStrategy, activationConfiguration.ActivationType, RequestType.Member, memberKVP.Key, false, true);

                    if (memberKVP.Value.LocateKey == null &&
                        scope.ScopeConfiguration.Behaviors.KeyedTypeSelector(memberType))
                    {
                        newRequest.SetLocateKey(memberKVP.Key.Name);
                    }
                    else
                    {
                        newRequest.SetLocateKey(memberKVP.Value.LocateKey);
                    }

                    newRequest.IsDynamic = memberKVP.Value.IsDynamic;
                    newRequest.SetIsRequired(memberKVP.Value.IsRequired);
                    newRequest.SetFilter(memberKVP.Value.Filter);

                    if (memberKVP.Value.DefaultValue != null)
                    {
                        newRequest.SetDefaultValue(new DefaultValueInformation {
                            DefaultValue = memberKVP.Value.DefaultValue
                        });
                    }

                    var memberResult = request.Services.ExpressionBuilder.GetActivationExpression(scope, newRequest);

                    if (memberResult == null)
                    {
                        if (memberKVP.Value.IsRequired)
                        {
                            throw new LocateException(newRequest.GetStaticInjectionContext());
                        }
                    }
                    else
                    {
                        bindings.Add(Expression.Bind(memberKVP.Key, memberResult.Expression));

                        result.AddExpressionResult(memberResult);
                    }
                }
                else
                {
                    bindings.Add(Expression.Bind(memberKVP.Key, expression));
                }
            }

            if (bindings.Count > 0)
            {
                result.Expression = Expression.MemberInit(newExpression, bindings);
            }

            return(result);
        }
        /// <summary>
        /// Creates a new expression request
        /// </summary>
        /// <param name="activationType">activation type</param>
        /// <param name="objectGraphDepth">current object depth</param>
        /// <param name="requestingScope">requesting scope</param>
        /// <returns>request</returns>
        public virtual IActivationExpressionRequest CreateNewRequest(Type activationType, int objectGraphDepth, IInjectionScope requestingScope)
        {
            if (activationType == null)
            {
                throw new ArgumentNullException(nameof(activationType));
            }
            if (requestingScope == null)
            {
                throw new ArgumentNullException(nameof(requestingScope));
            }

            return(new ActivationExpressionRequest(activationType,
                                                   RequestType.Root,
                                                   new ActivationServices(this, _builder, _attributeDiscoveryService, _exportExpressionBuilder, _injectionContextCreator),
                                                   _constants,
                                                   objectGraphDepth,
                                                   requestingScope));
        }
示例#53
0
        /// <summary>
        /// Get dictionary of members that need to be injected
        /// </summary>
        /// <param name="scope">scope</param>
        /// <param name="request">expression request</param>
        /// <param name="activationConfiguration">activation configuration</param>
        /// <returns></returns>
        protected virtual Dictionary <MemberInfo, MemberInjectionInfo> GetMemberInjectionInfoForConfiguration(IInjectionScope scope,
                                                                                                              IActivationExpressionRequest request, TypeActivationConfiguration activationConfiguration)
        {
            var members = new Dictionary <MemberInfo, MemberInjectionInfo>();

            var currentScope = scope;

            while (currentScope != null)
            {
                ProcessMemberSelectors(scope, request, activationConfiguration.ActivationType, currentScope.MemberInjectionSelectors, members);

                currentScope = currentScope.Parent as IInjectionScope;
            }

            ProcessMemberSelectors(scope, request, activationConfiguration.ActivationType, activationConfiguration.MemberInjectionSelectors, members);

            return(members);
        }
示例#54
0
        /// <summary>
        /// Get expression for parameter
        /// </summary>
        /// <param name="parameter"></param>
        /// <param name="parameterInfo"></param>
        /// <param name="injectionScope"></param>
        /// <param name="configuration"></param>
        /// <param name="request"></param>
        /// <returns></returns>
        protected virtual IActivationExpressionResult GetParameterExpression(ParameterInfo parameter, ConstructorParameterInfo parameterInfo, IInjectionScope injectionScope, TypeActivationConfiguration configuration, IActivationExpressionRequest request)
        {
            if (parameterInfo?.ExportFunc != null)
            {
                return(CallExportFunc(configuration.ActivationStrategy, parameter, parameterInfo, injectionScope, request, configuration.ExternallyOwned));
            }

            var newRequest = request.NewRequest(parameterInfo?.UseType ?? parameter.ParameterType,
                                                configuration.ActivationStrategy,
                                                configuration.ActivationType,
                                                RequestType.ConstructorParameter,
                                                parameter,
                                                true,
                                                true);

            if (parameterInfo?.LocateWithKey != null)
            {
                newRequest.SetLocateKey(parameterInfo.LocateWithKey);
            }
            else if (injectionScope.ScopeConfiguration.Behaviors.KeyedTypeSelector(parameter.ParameterType))
            {
                newRequest.SetLocateKey(parameter.Name);
            }

            if (parameterInfo?.DefaultValue != null)
            {
                newRequest.SetDefaultValue(new DefaultValueInformation {
                    DefaultValue = parameterInfo.DefaultValue
                });
            }
            else if (parameter.HasDefaultValue)
            {
                newRequest.SetDefaultValue(new DefaultValueInformation {
                    DefaultValue = parameter.DefaultValue
                });
            }

            if (parameterInfo != null)
            {
                newRequest.IsDynamic = parameterInfo.IsDynamic;

                newRequest.SetIsRequired(parameterInfo.IsRequired.GetValueOrDefault(!parameter.IsOptional));

                newRequest.SetFilter(parameterInfo.ExportStrategyFilter);

                newRequest.SetEnumerableComparer(parameterInfo.EnumerableComparer);
            }
            else
            {
                newRequest.SetIsRequired(!parameter.IsOptional);
            }

            return(newRequest.Services.ExpressionBuilder.GetActivationExpression(injectionScope, newRequest));
        }
 internal override bool GetIsAlreadyResolved(IInjectionScope scope) => _instancesPerScope.ContainsKey(scope);
示例#56
0
        private IActivationExpressionResult CallExportFunc(IActivationStrategy strategy, ParameterInfo parameter, ConstructorParameterInfo parameterInfo, IInjectionScope injectionScope, IActivationExpressionRequest request, bool configurationExternallyOwned)
        {
            var exportDelegate = parameterInfo.ExportFunc as Delegate;

            if (exportDelegate == null)
            {
                throw new ArgumentException($"Parameter Info {parameterInfo.ParameterName} is not delegate", nameof(parameterInfo));
            }

            var newRequest = request.NewRequest(parameter.ParameterType, strategy, strategy.ActivationType,
                                                RequestType.ConstructorParameter, parameter, false, true);

            return(ExpressionUtilities.CreateExpressionForDelegate(exportDelegate, ShouldTrackDisposable(configurationExternallyOwned, injectionScope, strategy), injectionScope, newRequest));
        }
        /// <summary>
        /// Create enumerable expression that is an array
        /// </summary>
        /// <param name="scope"></param>
        /// <param name="request"></param>
        /// <param name="arrayExpressionCreator"></param>
        /// <returns></returns>
        protected virtual IActivationExpressionResult CreateEnumerableExpressionUsingArrayExpression(IInjectionScope scope,
                                                                                                     IActivationExpressionRequest request, IArrayExpressionCreator arrayExpressionCreator)
        {
            var enumerableType = request.ActivationType.GenericTypeArguments[0];

            var arrayType = enumerableType.MakeArrayType();

            var newRequest = request.NewRequest(arrayType, request.RequestingStrategy,
                                                request.RequestingStrategy?.ActivationType, request.RequestType, request.Info, true, true);

            newRequest.SetFilter(request.Filter);
            newRequest.SetEnumerableComparer(request.EnumerableComparer);
            newRequest.SetLocateKey(request.LocateKey);

            var arrayExpression = arrayExpressionCreator.GetArrayExpression(scope, newRequest);

            return(arrayExpression);
        }
示例#58
0
 public void ConfigureContainer(IInjectionScope scope)
 {
     scope.SetupMvc();
 }
        /// <summary>
        /// Method used to invoke an activation delegate
        /// </summary>
        /// <param name="exportStrategyScope"></param>
        /// <param name="activationDelegate"></param>
        /// <param name="injectionContext"></param>
        /// <returns></returns>
        public static object InvokeActivationDelegate(ExportActivationDelegate activationDelegate,
			IInjectionScope exportStrategyScope,
			IInjectionContext injectionContext)
        {
            return activationDelegate(exportStrategyScope, injectionContext);
        }
        /// <summary>
        /// Create enumerable expression using a custom creator
        /// </summary>
        /// <param name="scope">injection scope</param>
        /// <param name="request">expression request</param>
        /// <param name="arrayExpressionCreator">array creator</param>
        /// <param name="enumerableCreator">custom enumerable creator</param>
        /// <returns></returns>
        protected virtual IActivationExpressionResult CreateEnumerableExpressionUsingCustomCreator(IInjectionScope scope,
                                                                                                   IActivationExpressionRequest request, IArrayExpressionCreator arrayExpressionCreator,
                                                                                                   IEnumerableCreator enumerableCreator)
        {
            var enumerableType = request.ActivationType.GenericTypeArguments[0];

            var arrayType = enumerableType.MakeArrayType();

            var newRequest =
                request.NewRequest(arrayType, request.RequestingStrategy,
                                   request.RequestingStrategy?.ActivationType, request.RequestType, request.Info, true, true);

            newRequest.SetFilter(request.Filter);
            newRequest.SetEnumerableComparer(request.EnumerableComparer);

            var arrayExpression = arrayExpressionCreator.GetArrayExpression(scope, newRequest);

            var enumerableExpression =
                Expression.Call(Expression.Constant(enumerableCreator),
                                CreateEnumerableMethod.MakeGenericMethod(enumerableType),
                                request.ScopeParameter,
                                arrayExpression.Expression);

            var returnResult = request.Services.Compiler.CreateNewResult(request, enumerableExpression);

            returnResult.AddExpressionResult(returnResult);

            return(returnResult);
        }