/// <summary> /// Get an activation expression for this strategy /// </summary> /// <param name="scope"></param> /// <param name="request"></param> /// <returns></returns> public override IActivationExpressionResult GetActivationExpression(IInjectionScope scope, IActivationExpressionRequest request) { var closedClass = typeof(LazyExpression <,>).MakeGenericType(request.ActivationType.GenericTypeArguments); var closedMethod = closedClass.GetRuntimeMethod("CreateLazy", new[] { typeof(IExportLocatorScope), typeof(IDisposalScope), typeof(IInjectionContext) }); var wrappedStrategy = request.GetWrappedStrategy(); if (wrappedStrategy == null) { throw new LocateException(request.GetStaticInjectionContext(), "Could not find strategy that is wrapped"); } var metadata = _strongMetadataInstanceProvider.GetMetadata(request.ActivationType.GenericTypeArguments[1], wrappedStrategy.Metadata); var instance = Activator.CreateInstance(closedClass, scope, request, this, metadata); var callExpression = Expression.Call(Expression.Constant(instance), closedMethod, request.Constants.ScopeParameter, request.DisposalScopeExpression, request.Constants.InjectionContextParameter); request.RequireInjectionContext(); return(request.Services.Compiler.CreateNewResult(request, callExpression)); }