Ability to derive Startup from a base class and have "Configure" and "ConfigureServices" be invoked from the base class when present.

This commit is contained in:
dtkujawski 2015-02-12 17:40:14 -06:00
parent 6208698a5c
commit fe3675a9e0
4 changed files with 47 additions and 17 deletions

View File

@ -29,18 +29,18 @@ namespace Microsoft.AspNet.Hosting.Startup
{ {
var methodNameWithEnv = string.Format(CultureInfo.InvariantCulture, methodName, environmentName); var methodNameWithEnv = string.Format(CultureInfo.InvariantCulture, methodName, environmentName);
var methodNameWithNoEnv = string.Format(CultureInfo.InvariantCulture, methodName, ""); var methodNameWithNoEnv = string.Format(CultureInfo.InvariantCulture, methodName, "");
var methodInfo = startupType.GetTypeInfo().GetDeclaredMethod(methodNameWithEnv) var methodInfo = startupType.GetMethod(methodNameWithEnv, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static)
?? startupType.GetTypeInfo().GetDeclaredMethod(methodNameWithNoEnv); ?? startupType.GetMethod(methodNameWithNoEnv, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);
if (methodInfo == null) if (methodInfo == null)
{ {
if (required) if (required)
{ {
throw new Exception(string.Format("TODO: {0} or {1} method not found", throw new Exception(string.Format("TODO: {0} or {1} method not found",
methodNameWithEnv, methodNameWithEnv,
methodNameWithNoEnv)); methodNameWithNoEnv));
} }
return null; return null;
} }
if (returnType != null && methodInfo.ReturnType != returnType) if (returnType != null && methodInfo.ReturnType != returnType)
{ {
@ -160,7 +160,7 @@ namespace Microsoft.AspNet.Hosting.Startup
} }
else else
{ {
// void ConfigureServices(IServiceCollection) // void ConfigureServices(IServiceCollection)
Invoke(servicesMethod, instance, builder, services); Invoke(servicesMethod, instance, builder, services);
if (builder != null) if (builder != null)
{ {

View File

@ -9,7 +9,7 @@ using System;
namespace Microsoft.AspNet.Hosting.Fakes namespace Microsoft.AspNet.Hosting.Fakes
{ {
public class Startup public class Startup : StartupBase
{ {
public Startup() public Startup()
{ {
@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Hosting.Fakes
}); });
} }
public void ConfigureRetailServices(IServiceCollection services) public void ConfigureRetailServices(IServiceCollection services)
{ {
services.AddOptions(); services.AddOptions();
services.Configure<FakeOptions>(o => services.Configure<FakeOptions>(o =>
@ -94,8 +94,8 @@ namespace Microsoft.AspNet.Hosting.Fakes
return services.BuildServiceProvider(); return services.BuildServiceProvider();
} }
public virtual void Configure(IApplicationBuilder builder) public virtual void Configure(IApplicationBuilder builder)
{ {
} }
} }
} }

View File

@ -0,0 +1,29 @@
// 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 Microsoft.AspNet.Builder;
using Microsoft.Framework.DependencyInjection;
using Microsoft.Framework.DependencyInjection.Fallback;
using Microsoft.Framework.OptionsModel;
using System;
namespace Microsoft.AspNet.Hosting.Fakes
{
public class StartupBase
{
public StartupBase()
{
}
public void ConfigureBaseClassServices(IServiceCollection services)
{
services.AddOptions();
services.Configure<FakeOptions>(o =>
{
o.Configured = true;
o.Environment = "BaseClass";
});
}
}
}

View File

@ -42,7 +42,8 @@ namespace Microsoft.AspNet.Hosting.Tests
[InlineData("StaticProvider")] [InlineData("StaticProvider")]
[InlineData("Provider")] [InlineData("Provider")]
[InlineData("ProviderArgs")] [InlineData("ProviderArgs")]
public void StartupClassAddsConfigureServicesToApplicationServices(string environment) [InlineData("BaseClass")]
public void StartupClassAddsConfigureServicesToApplicationServices(string environment)
{ {
var services = HostingServices.Create().BuildServiceProvider(); var services = HostingServices.Create().BuildServiceProvider();
var manager = services.GetRequiredService<IStartupManager>(); var manager = services.GetRequiredService<IStartupManager>();