60 lines
2.2 KiB
C#
60 lines
2.2 KiB
C#
// 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<IApplicationBuilder> eventually with this
|
|
public delegate void ConfigureDelegate(IApplicationBuilder builder);
|
|
|
|
public class ConfigureBuilder
|
|
{
|
|
public ConfigureBuilder(MethodInfo configure)
|
|
{
|
|
MethodInfo = configure;
|
|
}
|
|
|
|
public MethodInfo MethodInfo { get; }
|
|
|
|
public Action<IApplicationBuilder> 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);
|
|
}
|
|
}
|
|
} |