public virtual object Invoke(ServiceProvider provider)
            {
                object resolved;

                lock (provider._sync)
                {
                    if (!provider._resolvedServices.TryGetValue(_key, out resolved))
                    {
                        resolved = provider.CaptureDisposable(_serviceCallSite.Invoke(provider));
                        provider._resolvedServices.Add(_key, resolved);
                    }
                }
                return(resolved);
            }
        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);
        }
        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);
            });
        }
 public object Invoke(ServiceProvider provider)
 {
     return(provider.CaptureDisposable(_service.Invoke(provider)));
 }