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))); }