private IServiceCallSite TryCreateExact(ServiceDescriptor descriptor, Type serviceType, CallSiteChain callSiteChain) { if (serviceType == descriptor.ServiceType) { IServiceCallSite callSite; if (descriptor.ImplementationInstance != null) { callSite = new ConstantCallSite(descriptor.ServiceType, descriptor.ImplementationInstance); } else if (descriptor.ImplementationFactory != null) { callSite = new FactoryCallSite(descriptor.ServiceType, descriptor.ImplementationFactory); } else if (descriptor.ImplementationType != null) { callSite = CreateConstructorCallSite(descriptor.ServiceType, descriptor.ImplementationType, callSiteChain); } else { throw new InvalidOperationException("Invalid service descriptor"); } return(ApplyLifetime(callSite, descriptor, descriptor.Lifetime)); } return(null); }
protected override object VisitFactory(FactoryCallSite factoryCallSite, ServiceProviderEngineScope scope) { var obj = factoryCallSite.Factory(scope); var interceptors = InterceptorRuntimeCreate.CreatedInterceptors; var implementName = obj.GetType().FullName; if (interceptors != null && interceptors.Count > 0 && factoryCallSite.ServiceType.IsInterface && InterceptorRuntimeCreate.CanIntercept(implementName)) { Castle.DynamicProxy.ProxyGenerator generator = new Castle.DynamicProxy.ProxyGenerator(); obj = generator.CreateInterfaceProxyWithTarget(factoryCallSite.ServiceType, obj, interceptors.ToArray()); } return(obj); }
protected override Expression VisitFactory(FactoryCallSite factoryCallSite, ILEmitResolverBuilderContext argument) { if (argument.Factories == null) { argument.Factories = new List<Func<IServiceProvider, object>>(); } // this.Factories[i](ProviderScope) argument.Generator.Emit(OpCodes.Ldarg_0); argument.Generator.Emit(OpCodes.Ldfld, FactoriesField); argument.Generator.Emit(OpCodes.Ldc_I4, argument.Factories.Count); argument.Generator.Emit(OpCodes.Ldelem, typeof(Func<IServiceProvider, object>)); argument.Generator.Emit(OpCodes.Ldarg_1); argument.Generator.Emit(OpCodes.Call, ExpressionResolverBuilder.InvokeFactoryMethodInfo); argument.Factories.Add(factoryCallSite.Factory); return null; }
protected override ILEmitCallSiteAnalysisResult VisitFactory(FactoryCallSite factoryCallSite, object argument) => new ILEmitCallSiteAnalysisResult(FactoryILSize);
protected override object VisitFactory(FactoryCallSite factoryCallSite, CallSiteFormatterContext argument) { argument.WriteProperty("method", factoryCallSite.Factory.Method); return(null); }
protected override Expression VisitFactory(FactoryCallSite factoryCallSite, CallSiteExpressionBuilderContext context) { return(Expression.Invoke(Expression.Constant(factoryCallSite.Factory), context.ScopeParameter)); }
protected abstract TResult VisitFactory(FactoryCallSite factoryCallSite, TArgument argument);
protected override Expression BuildFactory(FactoryCallSite callSite) { return(Expression.Invoke(Expression.Constant(callSite.Factory), Parameter)); }
protected abstract TResult BuildFactory(FactoryCallSite factoryCallSite);
protected override Type VisitFactory(FactoryCallSite factoryCallSite, CallSiteValidatorState state) => null;
protected override object BuildFactory(FactoryCallSite factoryCallSite) { return(factoryCallSite.Factory(_serviceProvider)); }