// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Reflection; using Microsoft.AspNet.Builder; using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Hosting.Startup { // TODO: replace all Action eventually with this public delegate void ConfigureDelegate(IApplicationBuilder builder); public class ConfigureBuilder { public ConfigureBuilder(MethodInfo configure) { MethodInfo = configure; } public MethodInfo MethodInfo { get; } public Action Build(object instance) { return builder => Invoke(instance, builder); } private void Invoke(object instance, IApplicationBuilder builder) { var serviceProvider = builder.ApplicationServices; var parameterInfos = MethodInfo.GetParameters(); var parameters = new object[parameterInfos.Length]; for (var index = 0; index != parameterInfos.Length; ++index) { var parameterInfo = parameterInfos[index]; if (parameterInfo.ParameterType == typeof(IApplicationBuilder)) { parameters[index] = builder; } else { try { parameters[index] = serviceProvider.GetRequiredService(parameterInfo.ParameterType); } catch (Exception) { throw new Exception(string.Format( "Could not resolve a service of type '{0}' for the parameter '{1}' of method '{2}' on type '{3}'.", parameterInfo.ParameterType.FullName, parameterInfo.Name, MethodInfo.Name, MethodInfo.DeclaringType.FullName)); } } } MethodInfo.Invoke(instance, parameters); } } }