public Expression Build(Expression provider)
 {
     return(Expression.Call(
                provider,
                CaptureDisposableMethodInfo,
                _service.Build(provider)));
 }
Beispiel #2
0
        private static Func <ServiceProvider, object> CompileCallSite(IServiceCallSite callSite)
        {
            var providerExpression = Expression.Parameter(typeof(ServiceProvider), "provider");

            var lambdaExpression = Expression.Lambda <Func <ServiceProvider, object> >(
                callSite.Build(providerExpression),
                providerExpression);

            return(lambdaExpression.Compile());
        }
            public virtual Expression Build(Expression providerExpression)
            {
                var keyExpression = Expression.Constant(
                    _key,
                    typeof(IService));

                var resolvedExpression = Expression.Variable(typeof(object), "resolved");

                var resolvedServicesExpression = Expression.Field(
                    providerExpression,
                    "_resolvedServices");

                var tryGetValueExpression = Expression.Call(
                    resolvedServicesExpression,
                    TryGetValueMethodInfo,
                    keyExpression,
                    resolvedExpression);

                var captureDisposableExpression = Expression.Assign(
                    resolvedExpression,
                    Expression.Call(
                        providerExpression,
                        CaptureDisposableMethodInfo,
                        _serviceCallSite.Build(providerExpression)));

                var addValueExpression = Expression.Call(
                    resolvedServicesExpression,
                    AddMethodInfo,
                    keyExpression,
                    resolvedExpression);

                var blockExpression = Expression.Block(
                    typeof(object),
                    new[] { resolvedExpression },
                    Expression.IfThen(
                        Expression.Not(tryGetValueExpression),
                        Expression.Block(captureDisposableExpression, addValueExpression)),
                    resolvedExpression);

                return(Lock(providerExpression, blockExpression));
            }
        internal static Func <ServiceProvider, object> RealizeService(ServiceTable table, Type serviceType, IServiceCallSite callSite)
        {
            var callCount = 0;

            return(provider =>
            {
                if (Interlocked.Increment(ref callCount) == 2)
                {
                    Task.Run(() =>
                    {
                        var providerExpression = Expression.Parameter(typeof(ServiceProvider), "provider");

                        var lambdaExpression = Expression.Lambda <Func <ServiceProvider, object> >(
                            callSite.Build(providerExpression),
                            providerExpression);

                        table.RealizedServices[serviceType] = lambdaExpression.Compile();
                    });
                }

                return callSite.Invoke(provider);
            });
        }
        private static Func<ServiceProvider, object> CompileCallSite(IServiceCallSite callSite)
        {
            var providerExpression = Expression.Parameter(typeof(ServiceProvider), "provider");

            var lambdaExpression = Expression.Lambda<Func<ServiceProvider, object>>(
                callSite.Build(providerExpression),
                providerExpression);

            return lambdaExpression.Compile();
        }
        public object GetService(Type serviceType)
        {
            Func <ServiceProvider, object> serviceAccessor;

            if (this.RealizedServices.TryGetValue(serviceType, out serviceAccessor))
            {
                return(serviceAccessor(this));
            }

            IServiceCallSite serviceCallSite = this.GetServiceCallSite(serviceType, new HashSet <Type>());

            if (null != serviceCallSite)
            {
                var providerExpression = Expression.Parameter(typeof(ServiceProvider), "provider");
                this.RealizedServices[serviceType] = Expression.Lambda <Func <ServiceProvider, object> >(serviceCallSite.Build(providerExpression), providerExpression).Compile();
                return(serviceCallSite.Invoke(this));
            }

            this.RealizedServices[serviceType] = _ => null;
            return(null);
        }