diff --git a/shared/Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Sources/FactoryResolutionResult.cs b/shared/Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Sources/FactoryResolutionResult.cs index 2bf55d73cd..745cca7ebd 100644 --- a/shared/Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Sources/FactoryResolutionResult.cs +++ b/shared/Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Sources/FactoryResolutionResult.cs @@ -5,46 +5,50 @@ using System; namespace Microsoft.AspNetCore.Hosting.WebHostBuilderFactory { - internal class FactoryResolutionResult + internal class FactoryResolutionResult { public FactoryResolutionResultKind ResultKind { get; set; } public Type ProgramType { get; set; } - public Func WebHostFactory { get; set; } - public Func WebHostBuilderFactory { get; set; } + public Func WebHostFactory { get; set; } + public Func WebHostBuilderFactory { get; set; } - internal static FactoryResolutionResult NoBuildWebHost(Type programType) => - new FactoryResolutionResult + internal static FactoryResolutionResult NoBuildWebHost(Type programType) => + new FactoryResolutionResult { ProgramType = programType, ResultKind = FactoryResolutionResultKind.NoBuildWebHost }; - internal static FactoryResolutionResult NoCreateWebHostBuilder(Type programType) => - new FactoryResolutionResult + internal static FactoryResolutionResult NoCreateWebHostBuilder(Type programType) => + new FactoryResolutionResult { ProgramType = programType, ResultKind = FactoryResolutionResultKind.NoCreateWebHostBuilder }; - internal static FactoryResolutionResult NoEntryPoint() => - new FactoryResolutionResult + internal static FactoryResolutionResult NoEntryPoint() => + new FactoryResolutionResult { ResultKind = FactoryResolutionResultKind.NoEntryPoint }; - internal static FactoryResolutionResult Succeded(Func factory, Type programType) => new FactoryResolutionResult + internal static FactoryResolutionResult Succeded(Func factory, Type programType) => new FactoryResolutionResult { ProgramType = programType, ResultKind = FactoryResolutionResultKind.Success, WebHostFactory = factory }; - internal static FactoryResolutionResult Succeded(Func factory, Type programType) => new FactoryResolutionResult + internal static FactoryResolutionResult Succeded(Func factory, Type programType) => new FactoryResolutionResult { 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()); + } }; } } diff --git a/shared/Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Sources/WebHostFactoryResolver.cs b/shared/Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Sources/WebHostFactoryResolver.cs index 609ba1d932..496bb6ddcc 100644 --- a/shared/Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Sources/WebHostFactoryResolver.cs +++ b/shared/Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Sources/WebHostFactoryResolver.cs @@ -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 ResolveWebHostBuilderFactory(Assembly assembly) { var programType = assembly?.EntryPoint?.DeclaringType; if (programType == null) { - return FactoryResolutionResult.NoEntryPoint(); + return FactoryResolutionResult.NoEntryPoint(); } var factory = programType?.GetTypeInfo().GetDeclaredMethod(CreateWebHostBuilder); if (factory == null) { - return FactoryResolutionResult.NoCreateWebHostBuilder(programType); + return FactoryResolutionResult.NoCreateWebHostBuilder(programType); } - return FactoryResolutionResult.Succeded(args => (IWebHostBuilder)factory.Invoke(null, new object[] { args }), programType); + return FactoryResolutionResult.Succeded(args => (TWebhostBuilder)factory.Invoke(null, new object[] { args }), programType); } - public static FactoryResolutionResult ResolveWebHostFactory(Assembly assembly) + public static FactoryResolutionResult ResolveWebHostFactory(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(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.NoBuildWebHost(findResult.ProgramType); } else { - return FactoryResolutionResult.Succeded(args => (IWebHost)buildWebHostMethod.Invoke(null, new object[] { args }), findResult.ProgramType); + return FactoryResolutionResult.Succeded(args => (TWebhost)buildWebHostMethod.Invoke(null, new object[] { args }), findResult.ProgramType); } case FactoryResolutionResultKind.NoBuildWebHost: default: diff --git a/src/Microsoft.AspNetCore.TestHost/WebHostBuilderFactory.cs b/src/Microsoft.AspNetCore.TestHost/WebHostBuilderFactory.cs index 701cb19a6c..3a0b0a552e 100644 --- a/src/Microsoft.AspNetCore.TestHost/WebHostBuilderFactory.cs +++ b/src/Microsoft.AspNetCore.TestHost/WebHostBuilderFactory.cs @@ -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(assembly); if (result.ResultKind != FactoryResolutionResultKind.Success) { return null; diff --git a/test/Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Tests/WebHostFactoryResolverTests.cs b/test/Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Tests/WebHostFactoryResolverTests.cs index 0332b00209..f6b758781c 100644 --- a/test/Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Tests/WebHostFactoryResolverTests.cs +++ b/test/Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Tests/WebHostFactoryResolverTests.cs @@ -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(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(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(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(typeof(BuildWebHostPatternTestSite.Startup).Assembly); // Assert Assert.Equal(FactoryResolutionResultKind.Success, resolverResult.ResultKind);