protected TService ResolveImpl <TService, TFunc>(Func <TFunc, TService> factoryInvoker, string name = null, bool throwIfMissing = true)
        {
            ResolveContext <TService> context = null;
            var identifier = CreateServiceKey <TService, TFunc>(name);
            var entry      = GetEntry(identifier);

            if (entry.IsNull())
            {
                if (throwIfMissing)
                {
                    throw new ResolutionException(Resources.CouldNotResolveType.Fmt(identifier.ServiceType));
                }

                return(default(TService));
            }

            context = new ResolveContext <TService> {
                Entry     = entry,
                Key       = identifier,
                Container = this,
                Registry  = LateRegister,
                Factory   = Functional.Curry(CreateInstance, entry, (TFunc)entry.Factory, factoryInvoker)
            };

            return(entry.LifetimeStrategy.Resolve(context));
        }
Beispiel #2
0
        public IAspectExpressionBuilder VisitInvocation(IAspectDefinition aspectDefinition, IArgumentsWeavingSettings argumentsWeavingSettings)
        {
            Func <IAspectExpression, IAspectExpression> expressionFactory = null;

            if (lastAspect.IsInBinding)
            {
                if (previousAspectDefinition.AspectType == AspectType.MethodInterceptionAspect)
                {
                    expressionFactory = Functional.Curry <IAspectExpression, IAspectExpression>((ex) => {
                        return(new BindingAspectDecoratorExpression(aspectDefinition, argumentsWeavingSettings));
                    });
                }
                else
                {
                    expressionFactory = Functional.Curry <IAspectExpression, IAspectExpression>((ex) => {
                        return(new MethodInvokerAspectExpression(aspectDefinition, argumentsWeavingSettings, previousAspectDefinition));
                    });
                }
            }
            else
            {
                expressionFactory = Functional.Curry <IAspectExpression, IAspectExpression>((ex) => {
                    return(new NestedMethodInvokerAspectExpression(argumentsWeavingSettings, previousAspectDefinition));
                });
            }

            return(new AspectNodeExpressionBuilder(expressionFactory));
        }
Beispiel #3
0
        // asynchronous lift functions
        public static Task <TOut> LifTMid <TIn, TMid, TOut>(Func <TIn, TMid, TOut> selector, Task <TIn> item1, Task <TMid> item2)
        {
            // Func<TIn, Func<TMid, R>> curry = x => y => selector(x, y);

            var lifted1 = Pure(Functional.Curry(selector));
            var lifted2 = Apply(item1, lifted1);

            return(Apply(item2, lifted2));
        }
Beispiel #4
0
        public static Task <TOut> LifTOut <TIn, TMid1, TMid2, TOut>(Func <TIn, TMid1, TMid2, TOut> selector, Task <TIn> item1, Task <TMid1> item2, Task <TMid2> item3)
        {
            //Func<TIn, Func<TMid1, Func<TMid2, TOut>>> curry = x => y => z => selector(x, y, z);

            var lifted1 = Pure(Functional.Curry(selector));
            var lifted2 = Apply(item1, lifted1);
            var lifted3 = Apply(item2, lifted2);

            return(Apply(item3, lifted3));
        }
Beispiel #5
0
        public Func <IAspectDefinition, IAspectExpressionBuilder> Visit(MethodInterceptionAspectAttribute aspect)
        {
            return((IAspectDefinition aspectDefinition) => {
                Func <IAspectExpression, IAspectExpression> ctor = null;

                if (lastAspect.Top)
                {
                    ctor = Functional.Curry <IAspectExpression, IAspectExpression>(expression => {
                        return new TopMethodInterceptionAspectExpression(expression, aspectDefinition);
                    });

                    lastAspect = new Aspect();
                }
                else
                {
                    if (lastAspect.IsInBinding)
                    {
                        ctor = Functional.Curry <IAspectExpression, IAspectExpression>(expression => {
                            return new BindingMethodInterceptionAspectExpression(expression, aspectDefinition);
                        });
                    }
                    else
                    {
                        var _previousAspectDefinition = previousAspectDefinition;

                        ctor = Functional.Curry <IAspectExpression, IAspectExpression>(expression => {
                            return new NestedMethodInterceptionAspectExpression(expression, aspectDefinition, _previousAspectDefinition);
                        });
                    }
                }

                lastAspect.IsInBinding = true;
                previousAspectDefinition = aspectDefinition;

                return new AspectNodeExpressionBuilder(ctor);
            });
        }