Remove the implicit hosting dependency on WebHostBuilderFactory shared sources

This commit is contained in:
Javier Calvarro Nelson 2017-10-11 15:16:03 -07:00
parent 159a5f777e
commit cda9ec6fe4
4 changed files with 29 additions and 25 deletions

View File

@ -5,46 +5,50 @@ using System;
namespace Microsoft.AspNetCore.Hosting.WebHostBuilderFactory
{
internal class FactoryResolutionResult
internal class FactoryResolutionResult<TWebHost,TWebHostBuilder>
{
public FactoryResolutionResultKind ResultKind { get; set; }
public Type ProgramType { get; set; }
public Func<string[], IWebHost> WebHostFactory { get; set; }
public Func<string[], IWebHostBuilder> WebHostBuilderFactory { get; set; }
public Func<string[], TWebHost> WebHostFactory { get; set; }
public Func<string[], TWebHostBuilder> WebHostBuilderFactory { get; set; }
internal static FactoryResolutionResult NoBuildWebHost(Type programType) =>
new FactoryResolutionResult
internal static FactoryResolutionResult<TWebHost, TWebHostBuilder> NoBuildWebHost(Type programType) =>
new FactoryResolutionResult<TWebHost, TWebHostBuilder>
{
ProgramType = programType,
ResultKind = FactoryResolutionResultKind.NoBuildWebHost
};
internal static FactoryResolutionResult NoCreateWebHostBuilder(Type programType) =>
new FactoryResolutionResult
internal static FactoryResolutionResult<TWebHost, TWebHostBuilder> NoCreateWebHostBuilder(Type programType) =>
new FactoryResolutionResult<TWebHost, TWebHostBuilder>
{
ProgramType = programType,
ResultKind = FactoryResolutionResultKind.NoCreateWebHostBuilder
};
internal static FactoryResolutionResult NoEntryPoint() =>
new FactoryResolutionResult
internal static FactoryResolutionResult<TWebHost, TWebHostBuilder> NoEntryPoint() =>
new FactoryResolutionResult<TWebHost, TWebHostBuilder>
{
ResultKind = FactoryResolutionResultKind.NoEntryPoint
};
internal static FactoryResolutionResult Succeded(Func<string[], IWebHost> factory, Type programType) => new FactoryResolutionResult
internal static FactoryResolutionResult<TWebHost, TWebHostBuilder> Succeded(Func<string[], TWebHost> factory, Type programType) => new FactoryResolutionResult<TWebHost, TWebHostBuilder>
{
ProgramType = programType,
ResultKind = FactoryResolutionResultKind.Success,
WebHostFactory = factory
};
internal static FactoryResolutionResult Succeded(Func<string[], IWebHostBuilder> factory, Type programType) => new FactoryResolutionResult
internal static FactoryResolutionResult<TWebHost, TWebHostBuilder> Succeded(Func<string[], TWebHostBuilder> factory, Type programType) => new FactoryResolutionResult<TWebHost, TWebHostBuilder>
{
ProgramType = programType,
ResultKind = FactoryResolutionResultKind.Success,
WebHostBuilderFactory = factory,
WebHostFactory = args => factory(args).Build()
WebHostFactory = args =>
{
var builder = factory(args);
return (TWebHost)builder.GetType().GetMethod("Build").Invoke(builder, Array.Empty<object>());
}
};
}
}

View File

@ -11,28 +11,28 @@ namespace Microsoft.AspNetCore.Hosting.WebHostBuilderFactory
public static readonly string CreateWebHostBuilder = nameof(CreateWebHostBuilder);
public static readonly string BuildWebHost = nameof(BuildWebHost);
public static FactoryResolutionResult ResolveWebHostBuilderFactory(Assembly assembly)
public static FactoryResolutionResult<TWebhost,TWebhostBuilder> ResolveWebHostBuilderFactory<TWebhost, TWebhostBuilder>(Assembly assembly)
{
var programType = assembly?.EntryPoint?.DeclaringType;
if (programType == null)
{
return FactoryResolutionResult.NoEntryPoint();
return FactoryResolutionResult<TWebhost, TWebhostBuilder>.NoEntryPoint();
}
var factory = programType?.GetTypeInfo().GetDeclaredMethod(CreateWebHostBuilder);
if (factory == null)
{
return FactoryResolutionResult.NoCreateWebHostBuilder(programType);
return FactoryResolutionResult<TWebhost, TWebhostBuilder>.NoCreateWebHostBuilder(programType);
}
return FactoryResolutionResult.Succeded(args => (IWebHostBuilder)factory.Invoke(null, new object[] { args }), programType);
return FactoryResolutionResult<TWebhost, TWebhostBuilder>.Succeded(args => (TWebhostBuilder)factory.Invoke(null, new object[] { args }), programType);
}
public static FactoryResolutionResult ResolveWebHostFactory(Assembly assembly)
public static FactoryResolutionResult<TWebhost, TWebhostBuilder> ResolveWebHostFactory<TWebhost, TWebhostBuilder>(Assembly assembly)
{
// We want to give priority to BuildWebHost over CreateWebHostBuilder for backwards
// compatibility with existing projects that follow the old pattern.
var findResult = ResolveWebHostBuilderFactory(assembly);
var findResult = ResolveWebHostBuilderFactory<TWebhost, TWebhostBuilder>(assembly);
switch (findResult.ResultKind)
{
case FactoryResolutionResultKind.NoEntryPoint:
@ -47,11 +47,11 @@ namespace Microsoft.AspNetCore.Hosting.WebHostBuilderFactory
return findResult;
}
return FactoryResolutionResult.NoBuildWebHost(findResult.ProgramType);
return FactoryResolutionResult<TWebhost, TWebhostBuilder>.NoBuildWebHost(findResult.ProgramType);
}
else
{
return FactoryResolutionResult.Succeded(args => (IWebHost)buildWebHostMethod.Invoke(null, new object[] { args }), findResult.ProgramType);
return FactoryResolutionResult<TWebhost, TWebhostBuilder>.Succeded(args => (TWebhost)buildWebHostMethod.Invoke(null, new object[] { args }), findResult.ProgramType);
}
case FactoryResolutionResultKind.NoBuildWebHost:
default:

View File

@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.TestHost
{
public static IWebHostBuilder CreateFromAssemblyEntryPoint(Assembly assembly, string [] args)
{
var result = WebHostFactoryResolver.ResolveWebHostBuilderFactory(assembly);
var result = WebHostFactoryResolver.ResolveWebHostBuilderFactory<IWebHost,IWebHostBuilder>(assembly);
if (result.ResultKind != FactoryResolutionResultKind.Success)
{
return null;

View File

@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Tests
public void CanFindWebHostBuilder_CreateWebHostBuilderPattern()
{
// Arrange & Act
var resolverResult = WebHostFactoryResolver.ResolveWebHostBuilderFactory(typeof(IStartupInjectionAssemblyName.Startup).Assembly);
var resolverResult = WebHostFactoryResolver.ResolveWebHostBuilderFactory<IWebHost,IWebHostBuilder>(typeof(IStartupInjectionAssemblyName.Startup).Assembly);
// Assert
Assert.Equal(FactoryResolutionResultKind.Success, resolverResult.ResultKind);
@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Tests
public void CanFindWebHost_CreateWebHostBuilderPattern()
{
// Arrange & Act
var resolverResult = WebHostFactoryResolver.ResolveWebHostFactory(typeof(IStartupInjectionAssemblyName.Startup).Assembly);
var resolverResult = WebHostFactoryResolver.ResolveWebHostFactory<IWebHost, IWebHostBuilder>(typeof(IStartupInjectionAssemblyName.Startup).Assembly);
// Assert
Assert.Equal(FactoryResolutionResultKind.Success, resolverResult.ResultKind);
@ -37,7 +37,7 @@ namespace Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Tests
public void CanNotFindWebHostBuilder_BuildWebHostPattern()
{
// Arrange & Act
var resolverResult = WebHostFactoryResolver.ResolveWebHostBuilderFactory(typeof(BuildWebHostPatternTestSite.Startup).Assembly);
var resolverResult = WebHostFactoryResolver.ResolveWebHostBuilderFactory<IWebHost, IWebHostBuilder>(typeof(BuildWebHostPatternTestSite.Startup).Assembly);
// Assert
Assert.Equal(FactoryResolutionResultKind.NoCreateWebHostBuilder, resolverResult.ResultKind);
@ -49,7 +49,7 @@ namespace Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Tests
public void CanFindWebHost_BuildWebHostPattern()
{
// Arrange & Act
var resolverResult = WebHostFactoryResolver.ResolveWebHostFactory(typeof(BuildWebHostPatternTestSite.Startup).Assembly);
var resolverResult = WebHostFactoryResolver.ResolveWebHostFactory<IWebHost, IWebHostBuilder>(typeof(BuildWebHostPatternTestSite.Startup).Assembly);
// Assert
Assert.Equal(FactoryResolutionResultKind.Success, resolverResult.ResultKind);