public Expression Build(Expression provider) { return(Expression.Call( provider, CaptureDisposableMethodInfo, _service.Build(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 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); }