Add extension methods in our test host package to streamline setup of apps.
* Create a sources package to encode the convention followed in our templates to create a WebHost. * Add an extension method to setup the content root relative to the solution folder. * Add a factory method to create a WebHostBuilder based on the pattern followed in our template.
This commit is contained in:
parent
1c3fa82908
commit
c24c717eee
34
Hosting.sln
34
Hosting.sln
|
|
@ -1,6 +1,6 @@
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 15
|
# Visual Studio 15
|
||||||
VisualStudioVersion = 15.0.26730.10
|
VisualStudioVersion = 15.0.26913.0
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}"
|
||||||
ProjectSection(SolutionItems) = preProject
|
ProjectSection(SolutionItems) = preProject
|
||||||
|
|
@ -63,6 +63,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GenericWebHost", "samples\G
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Hosting.Tests", "test\Microsoft.Extensions.Hosting.Tests\Microsoft.Extensions.Hosting.Tests.csproj", "{45E296BB-7628-49AF-B5A5-04CD9A89CAD3}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Hosting.Tests", "test\Microsoft.Extensions.Hosting.Tests\Microsoft.Extensions.Hosting.Tests.csproj", "{45E296BB-7628-49AF-B5A5-04CD9A89CAD3}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Tests", "test\Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Tests\Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Tests.csproj", "{3834E274-3AF5-4751-8857-5B67BBE607DD}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BuildWebHostPatternTestSite", "test\TestAssets\BuildWebHostPatternTestSite\BuildWebHostPatternTestSite.csproj", "{37C4BD55-CD39-4C4E-BA01-0AEAFCE128F1}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
|
@ -293,6 +297,30 @@ Global
|
||||||
{45E296BB-7628-49AF-B5A5-04CD9A89CAD3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
{45E296BB-7628-49AF-B5A5-04CD9A89CAD3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
{45E296BB-7628-49AF-B5A5-04CD9A89CAD3}.Release|x86.ActiveCfg = Release|Any CPU
|
{45E296BB-7628-49AF-B5A5-04CD9A89CAD3}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{45E296BB-7628-49AF-B5A5-04CD9A89CAD3}.Release|x86.Build.0 = Release|Any CPU
|
{45E296BB-7628-49AF-B5A5-04CD9A89CAD3}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{3834E274-3AF5-4751-8857-5B67BBE607DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{3834E274-3AF5-4751-8857-5B67BBE607DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{3834E274-3AF5-4751-8857-5B67BBE607DD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{3834E274-3AF5-4751-8857-5B67BBE607DD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{3834E274-3AF5-4751-8857-5B67BBE607DD}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{3834E274-3AF5-4751-8857-5B67BBE607DD}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{3834E274-3AF5-4751-8857-5B67BBE607DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{3834E274-3AF5-4751-8857-5B67BBE607DD}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{3834E274-3AF5-4751-8857-5B67BBE607DD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{3834E274-3AF5-4751-8857-5B67BBE607DD}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{3834E274-3AF5-4751-8857-5B67BBE607DD}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{3834E274-3AF5-4751-8857-5B67BBE607DD}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{37C4BD55-CD39-4C4E-BA01-0AEAFCE128F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{37C4BD55-CD39-4C4E-BA01-0AEAFCE128F1}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{37C4BD55-CD39-4C4E-BA01-0AEAFCE128F1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{37C4BD55-CD39-4C4E-BA01-0AEAFCE128F1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{37C4BD55-CD39-4C4E-BA01-0AEAFCE128F1}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{37C4BD55-CD39-4C4E-BA01-0AEAFCE128F1}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{37C4BD55-CD39-4C4E-BA01-0AEAFCE128F1}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{37C4BD55-CD39-4C4E-BA01-0AEAFCE128F1}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{37C4BD55-CD39-4C4E-BA01-0AEAFCE128F1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{37C4BD55-CD39-4C4E-BA01-0AEAFCE128F1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{37C4BD55-CD39-4C4E-BA01-0AEAFCE128F1}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{37C4BD55-CD39-4C4E-BA01-0AEAFCE128F1}.Release|x86.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
@ -312,12 +340,14 @@ Global
|
||||||
{AB0B7394-278D-4838-A59C-276ED88D00CC} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0}
|
{AB0B7394-278D-4838-A59C-276ED88D00CC} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0}
|
||||||
{FA7D2012-C1B4-4AF7-9ADD-381B2004EA16} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0}
|
{FA7D2012-C1B4-4AF7-9ADD-381B2004EA16} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0}
|
||||||
{EDFF02F0-A8A4-4EB1-A179-94D7500FB266} = {FA7D2012-C1B4-4AF7-9ADD-381B2004EA16}
|
{EDFF02F0-A8A4-4EB1-A179-94D7500FB266} = {FA7D2012-C1B4-4AF7-9ADD-381B2004EA16}
|
||||||
{58194285-5891-464A-A96B-0FE043029E8A} = {FA7D2012-C1B4-4AF7-9ADD-381B2004EA16}
|
{58194285-5891-464A-A96B-0FE043029E8A} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0}
|
||||||
{F894D8C5-B760-4734-AD31-3CA6FC557CCF} = {FA7D2012-C1B4-4AF7-9ADD-381B2004EA16}
|
{F894D8C5-B760-4734-AD31-3CA6FC557CCF} = {FA7D2012-C1B4-4AF7-9ADD-381B2004EA16}
|
||||||
{8529E5F7-059F-4A06-AD6E-ECDF4F4838FE} = {9C7520A0-F2EB-411C-8BB2-80B39C937217}
|
{8529E5F7-059F-4A06-AD6E-ECDF4F4838FE} = {9C7520A0-F2EB-411C-8BB2-80B39C937217}
|
||||||
{1DA77D55-5DB9-4426-87DC-758579335944} = {E0497F39-AFFB-4819-A116-E39E361915AB}
|
{1DA77D55-5DB9-4426-87DC-758579335944} = {E0497F39-AFFB-4819-A116-E39E361915AB}
|
||||||
{FCDD1C82-623C-4779-8A9C-B0D827CEA8BF} = {9C7520A0-F2EB-411C-8BB2-80B39C937217}
|
{FCDD1C82-623C-4779-8A9C-B0D827CEA8BF} = {9C7520A0-F2EB-411C-8BB2-80B39C937217}
|
||||||
{45E296BB-7628-49AF-B5A5-04CD9A89CAD3} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0}
|
{45E296BB-7628-49AF-B5A5-04CD9A89CAD3} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0}
|
||||||
|
{3834E274-3AF5-4751-8857-5B67BBE607DD} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0}
|
||||||
|
{37C4BD55-CD39-4C4E-BA01-0AEAFCE128F1} = {FA7D2012-C1B4-4AF7-9ADD-381B2004EA16}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {AABD536D-E05F-409B-A716-535E0C478076}
|
SolutionGuid = {AABD536D-E05F-409B-A716-535E0C478076}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
],
|
],
|
||||||
"packages": {
|
"packages": {
|
||||||
"Microsoft.AspNetCore.Certificates.Configuration.Sources": {},
|
"Microsoft.AspNetCore.Certificates.Configuration.Sources": {},
|
||||||
|
"Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Sources": {},
|
||||||
"Microsoft.AspNetCore.Server.IntegrationTesting": {}
|
"Microsoft.AspNetCore.Server.IntegrationTesting": {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Hosting.WebHostBuilderFactory
|
||||||
|
{
|
||||||
|
internal class FactoryResolutionResult
|
||||||
|
{
|
||||||
|
public FactoryResolutionResultKind ResultKind { get; set; }
|
||||||
|
public Type ProgramType { get; set; }
|
||||||
|
public Func<string[], IWebHost> WebHostFactory { get; set; }
|
||||||
|
public Func<string[], IWebHostBuilder> WebHostBuilderFactory { get; set; }
|
||||||
|
|
||||||
|
internal static FactoryResolutionResult NoBuildWebHost(Type programType) =>
|
||||||
|
new FactoryResolutionResult
|
||||||
|
{
|
||||||
|
ProgramType = programType,
|
||||||
|
ResultKind = FactoryResolutionResultKind.NoBuildWebHost
|
||||||
|
};
|
||||||
|
|
||||||
|
internal static FactoryResolutionResult NoCreateWebHostBuilder(Type programType) =>
|
||||||
|
new FactoryResolutionResult
|
||||||
|
{
|
||||||
|
ProgramType = programType,
|
||||||
|
ResultKind = FactoryResolutionResultKind.NoCreateWebHostBuilder
|
||||||
|
};
|
||||||
|
|
||||||
|
internal static FactoryResolutionResult NoEntryPoint() =>
|
||||||
|
new FactoryResolutionResult
|
||||||
|
{
|
||||||
|
ResultKind = FactoryResolutionResultKind.NoEntryPoint
|
||||||
|
};
|
||||||
|
|
||||||
|
internal static FactoryResolutionResult Succeded(Func<string[], IWebHost> factory, Type programType) => new FactoryResolutionResult
|
||||||
|
{
|
||||||
|
ProgramType = programType,
|
||||||
|
ResultKind = FactoryResolutionResultKind.Success,
|
||||||
|
WebHostFactory = factory
|
||||||
|
};
|
||||||
|
|
||||||
|
internal static FactoryResolutionResult Succeded(Func<string[], IWebHostBuilder> factory, Type programType) => new FactoryResolutionResult
|
||||||
|
{
|
||||||
|
ProgramType = programType,
|
||||||
|
ResultKind = FactoryResolutionResultKind.Success,
|
||||||
|
WebHostBuilderFactory = factory,
|
||||||
|
WebHostFactory = args => factory(args).Build()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Hosting.WebHostBuilderFactory
|
||||||
|
{
|
||||||
|
internal enum FactoryResolutionResultKind
|
||||||
|
{
|
||||||
|
Success,
|
||||||
|
NoEntryPoint,
|
||||||
|
NoCreateWebHostBuilder,
|
||||||
|
NoBuildWebHost
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
// Copyright (c) .NET Foundation. 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;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Hosting.WebHostBuilderFactory
|
||||||
|
{
|
||||||
|
internal class WebHostFactoryResolver
|
||||||
|
{
|
||||||
|
public static readonly string CreateWebHostBuilder = nameof(CreateWebHostBuilder);
|
||||||
|
public static readonly string BuildWebHost = nameof(BuildWebHost);
|
||||||
|
|
||||||
|
public static FactoryResolutionResult ResolveWebHostBuilderFactory(Assembly assembly)
|
||||||
|
{
|
||||||
|
var programType = assembly?.EntryPoint?.DeclaringType;
|
||||||
|
if (programType == null)
|
||||||
|
{
|
||||||
|
return FactoryResolutionResult.NoEntryPoint();
|
||||||
|
}
|
||||||
|
|
||||||
|
var factory = programType?.GetTypeInfo().GetDeclaredMethod(CreateWebHostBuilder);
|
||||||
|
if (factory == null)
|
||||||
|
{
|
||||||
|
return FactoryResolutionResult.NoCreateWebHostBuilder(programType);
|
||||||
|
}
|
||||||
|
|
||||||
|
return FactoryResolutionResult.Succeded(args => (IWebHostBuilder)factory.Invoke(null, new object[] { args }), programType);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
switch (findResult.ResultKind)
|
||||||
|
{
|
||||||
|
case FactoryResolutionResultKind.NoEntryPoint:
|
||||||
|
return findResult;
|
||||||
|
case FactoryResolutionResultKind.Success:
|
||||||
|
case FactoryResolutionResultKind.NoCreateWebHostBuilder:
|
||||||
|
var buildWebHostMethod = findResult.ProgramType.GetTypeInfo().GetDeclaredMethod("BuildWebHost");
|
||||||
|
if (buildWebHostMethod == null)
|
||||||
|
{
|
||||||
|
if (findResult.ResultKind == FactoryResolutionResultKind.Success)
|
||||||
|
{
|
||||||
|
return findResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FactoryResolutionResult.NoBuildWebHost(findResult.ProgramType);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return FactoryResolutionResult.Succeded(args => (IWebHost)buildWebHostMethod.Invoke(null, new object[] { args }), findResult.ProgramType);
|
||||||
|
}
|
||||||
|
case FactoryResolutionResultKind.NoBuildWebHost:
|
||||||
|
default:
|
||||||
|
throw new InvalidOperationException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,6 +8,12 @@
|
||||||
<PackageTags>aspnetcore;hosting;testing</PackageTags>
|
<PackageTags>aspnetcore;hosting;testing</PackageTags>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="..\..\shared\Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Sources\FactoryResolutionResult.cs" />
|
||||||
|
<Compile Include="..\..\shared\Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Sources\FactoryResolutionResultKind.cs" />
|
||||||
|
<Compile Include="..\..\shared\Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Sources\WebHostFactoryResolver.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Microsoft.AspNetCore.Hosting\Microsoft.AspNetCore.Hosting.csproj" />
|
<ProjectReference Include="..\Microsoft.AspNetCore.Hosting\Microsoft.AspNetCore.Hosting.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
|
|
@ -47,6 +49,35 @@ namespace Microsoft.AspNetCore.TestHost
|
||||||
return webHostBuilder;
|
return webHostBuilder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IWebHostBuilder UseSolutionRelativeContentRoot(
|
||||||
|
this IWebHostBuilder builder,
|
||||||
|
string solutionRelativePath,
|
||||||
|
string solutionName = "*.sln")
|
||||||
|
{
|
||||||
|
if (solutionRelativePath == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(solutionRelativePath));
|
||||||
|
}
|
||||||
|
|
||||||
|
var applicationBasePath = AppContext.BaseDirectory;
|
||||||
|
|
||||||
|
var directoryInfo = new DirectoryInfo(applicationBasePath);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
var solutionPath = Directory.EnumerateFiles(directoryInfo.FullName, solutionName).FirstOrDefault();
|
||||||
|
if (solutionPath != null)
|
||||||
|
{
|
||||||
|
builder.UseContentRoot(Path.GetFullPath(Path.Combine(directoryInfo.FullName, solutionRelativePath)));
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
directoryInfo = directoryInfo.Parent;
|
||||||
|
}
|
||||||
|
while (directoryInfo.Parent != null);
|
||||||
|
|
||||||
|
throw new InvalidOperationException($"Solution root could not be located using application root {applicationBasePath}.");
|
||||||
|
}
|
||||||
|
|
||||||
private class ConfigureTestServicesStartupConfigureServicesFilter : IStartupConfigureServicesFilter
|
private class ConfigureTestServicesStartupConfigureServicesFilter : IStartupConfigureServicesFilter
|
||||||
{
|
{
|
||||||
private readonly Action<IServiceCollection> _servicesConfiguration;
|
private readonly Action<IServiceCollection> _servicesConfiguration;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Reflection;
|
||||||
|
using Microsoft.AspNetCore.Hosting;
|
||||||
|
using Microsoft.AspNetCore.Hosting.WebHostBuilderFactory;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.TestHost
|
||||||
|
{
|
||||||
|
public static class WebHostBuilderFactory
|
||||||
|
{
|
||||||
|
public static IWebHostBuilder CreateFromAssemblyEntryPoint(Assembly assembly, string [] args)
|
||||||
|
{
|
||||||
|
var result = WebHostFactoryResolver.ResolveWebHostBuilderFactory(assembly);
|
||||||
|
if (result.ResultKind != FactoryResolutionResultKind.Success)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.WebHostBuilderFactory(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IWebHostBuilder CreateFromTypesAssemblyEntryPoint<T>(string[] args) =>
|
||||||
|
CreateFromAssemblyEntryPoint(typeof(T).Assembly, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFrameworks>netcoreapp2.0;net461</TargetFrameworks>
|
||||||
|
<TargetFrameworks Condition=" '$(OS)' != 'Windows_NT' ">netcoreapp2.0</TargetFrameworks>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="..\..\shared\Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Sources\**\*.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\src\Microsoft.AspNetCore.Hosting.Abstractions\Microsoft.AspNetCore.Hosting.Abstractions.csproj" />
|
||||||
|
<ProjectReference Include="..\TestAssets\BuildWebHostPatternTestSite\BuildWebHostPatternTestSite.csproj" />
|
||||||
|
<ProjectReference Include="..\TestAssets\IStartupInjectionAssemblyName\IStartupInjectionAssemblyName.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
|
@ -0,0 +1,60 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Hosting.WebHostBuilderFactory.Tests
|
||||||
|
{
|
||||||
|
public class WebHostFactoryResolverTests
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void CanFindWebHostBuilder_CreateWebHostBuilderPattern()
|
||||||
|
{
|
||||||
|
// Arrange & Act
|
||||||
|
var resolverResult = WebHostFactoryResolver.ResolveWebHostBuilderFactory(typeof(IStartupInjectionAssemblyName.Startup).Assembly);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(FactoryResolutionResultKind.Success, resolverResult.ResultKind);
|
||||||
|
Assert.NotNull(resolverResult.WebHostBuilderFactory);
|
||||||
|
Assert.NotNull(resolverResult.WebHostFactory);
|
||||||
|
Assert.IsAssignableFrom<IWebHostBuilder>(resolverResult.WebHostBuilderFactory(Array.Empty<string>()));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CanFindWebHost_CreateWebHostBuilderPattern()
|
||||||
|
{
|
||||||
|
// Arrange & Act
|
||||||
|
var resolverResult = WebHostFactoryResolver.ResolveWebHostFactory(typeof(IStartupInjectionAssemblyName.Startup).Assembly);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(FactoryResolutionResultKind.Success, resolverResult.ResultKind);
|
||||||
|
Assert.NotNull(resolverResult.WebHostBuilderFactory);
|
||||||
|
Assert.NotNull(resolverResult.WebHostFactory);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CanNotFindWebHostBuilder_BuildWebHostPattern()
|
||||||
|
{
|
||||||
|
// Arrange & Act
|
||||||
|
var resolverResult = WebHostFactoryResolver.ResolveWebHostBuilderFactory(typeof(BuildWebHostPatternTestSite.Startup).Assembly);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(FactoryResolutionResultKind.NoCreateWebHostBuilder, resolverResult.ResultKind);
|
||||||
|
Assert.Null(resolverResult.WebHostBuilderFactory);
|
||||||
|
Assert.Null(resolverResult.WebHostFactory);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void CanFindWebHost_BuildWebHostPattern()
|
||||||
|
{
|
||||||
|
// Arrange & Act
|
||||||
|
var resolverResult = WebHostFactoryResolver.ResolveWebHostFactory(typeof(BuildWebHostPatternTestSite.Startup).Assembly);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.Equal(FactoryResolutionResultKind.Success, resolverResult.ResultKind);
|
||||||
|
Assert.Null(resolverResult.WebHostBuilderFactory);
|
||||||
|
Assert.NotNull(resolverResult.WebHostFactory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFrameworks>netcoreapp2.0;net461</TargetFrameworks>
|
||||||
|
<TargetFrameworks Condition=" '$(OS)' != 'Windows_NT' ">netcoreapp2.0</TargetFrameworks>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.Hosting\Microsoft.AspNetCore.Hosting.csproj" />
|
||||||
|
<ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.TestHost\Microsoft.AspNetCore.TestHost.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.Extensions.DependencyInjection" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using Microsoft.AspNetCore.Hosting;
|
||||||
|
|
||||||
|
namespace BuildWebHostPatternTestSite
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IWebHost BuildWebHost(string[] args) => null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using Microsoft.AspNetCore.Builder;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
|
namespace BuildWebHostPatternTestSite
|
||||||
|
{
|
||||||
|
public class Startup
|
||||||
|
{
|
||||||
|
public void ConfigureServices(IServiceCollection services)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Configure(IApplicationBuilder builder)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netcoreapp2.0;net461</TargetFrameworks>
|
<TargetFrameworks>netcoreapp2.0;net461</TargetFrameworks>
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,7 @@ namespace IStartupInjectionAssemblyName
|
||||||
{
|
{
|
||||||
public static void Main(string[] args)
|
public static void Main(string[] args)
|
||||||
{
|
{
|
||||||
var server = new TestServer(new WebHostBuilder()
|
var server = new TestServer(CreateWebHostBuilder(args));
|
||||||
.ConfigureServices(services => services.AddSingleton<IStartup, Startup>()));
|
|
||||||
|
|
||||||
// Mimic application startup messages so application deployer knows that the application has started
|
// Mimic application startup messages so application deployer knows that the application has started
|
||||||
Console.WriteLine("Application started. Press Ctrl+C to shut down.");
|
Console.WriteLine("Application started. Press Ctrl+C to shut down.");
|
||||||
|
|
@ -22,5 +21,9 @@ namespace IStartupInjectionAssemblyName
|
||||||
|
|
||||||
Task.Run(async () => Console.WriteLine(await server.CreateClient().GetStringAsync(""))).GetAwaiter().GetResult();
|
Task.Run(async () => Console.WriteLine(await server.CreateClient().GetStringAsync(""))).GetAwaiter().GetResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do not change the signature of this method. It's used for tests.
|
||||||
|
private static IWebHostBuilder CreateWebHostBuilder(string [] args) =>
|
||||||
|
new WebHostBuilder().ConfigureServices(services => services.AddSingleton<IStartup, Startup>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"iisSettings": {
|
||||||
|
"windowsAuthentication": false,
|
||||||
|
"anonymousAuthentication": true,
|
||||||
|
"iisExpress": {
|
||||||
|
"applicationUrl": "http://localhost:50801/",
|
||||||
|
"sslPort": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"profiles": {
|
||||||
|
"IIS Express": {
|
||||||
|
"commandName": "IISExpress",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"IStartupInjectionAssemblyName": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
},
|
||||||
|
"applicationUrl": "http://localhost:50802/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>netcoreapp2.0;net461</TargetFrameworks>
|
<TargetFrameworks>netcoreapp2.0;net461</TargetFrameworks>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"iisSettings": {
|
||||||
|
"windowsAuthentication": false,
|
||||||
|
"anonymousAuthentication": true,
|
||||||
|
"iisExpress": {
|
||||||
|
"applicationUrl": "http://localhost:50800/",
|
||||||
|
"sslPort": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"profiles": {
|
||||||
|
"IIS Express": {
|
||||||
|
"commandName": "IISExpress",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.AspNetCore.Hosting.TestSites": {
|
||||||
|
"commandName": "Project",
|
||||||
|
"launchBrowser": true,
|
||||||
|
"environmentVariables": {
|
||||||
|
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||||
|
},
|
||||||
|
"applicationUrl": "http://localhost:50803/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue