Merge pull request #7534 from aspnet/release/2.1

Release/2.1
This commit is contained in:
Pranav K 2018-03-23 09:38:37 -07:00 committed by GitHub
commit bb408e9f18
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 154 additions and 64 deletions

View File

@ -1,5 +1,5 @@
{
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.Abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.Abstractions, Version=2.0.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"Types": [
{
"Name": "Microsoft.AspNetCore.Mvc.ActionContext",

View File

@ -1,5 +1,5 @@
{
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.ApiExplorer, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.ApiExplorer, Version=2.0.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"Types": [
{
"Name": "Microsoft.AspNetCore.Mvc.ApiExplorer.ApiDescriptionExtensions",

View File

@ -19,27 +19,17 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
/// </summary>
public abstract class ApplicationPartFactory
{
public static readonly string DefaultContextName = "Default";
/// <summary>
/// Default implementation for <see cref="ApplicationPartFactory"/>.
/// </summary>
public static ApplicationPartFactory Default { get; } = new DefaultApplicationPartFactory();
/// <summary>
/// Gets one or more <see cref="ApplicationPart"/> instances for the specified <paramref name="assembly"/>.
/// </summary>
/// <param name="assembly">The <see cref="Assembly"/>.</param>
/// <param name="context">
/// The context name. By default, value of this parameter is <see cref="DefaultContextName"/>.
/// </param>
public abstract IEnumerable<ApplicationPart> GetApplicationParts(Assembly assembly, string context);
public abstract IEnumerable<ApplicationPart> GetApplicationParts(Assembly assembly);
/// <summary>
/// Gets the <see cref="ApplicationPartFactory"/> for the specified assembly.
/// <para>
/// An assembly may specify an <see cref="ApplicationPartFactory"/> using <see cref="ProvideApplicationPartFactoryAttribute"/>.
/// Otherwise, <see cref="ApplicationPartFactory.Default"/> is used.
/// Otherwise, <see cref="DefaultApplicationPartFactory"/> is used.
/// </para>
/// </summary>
/// <param name="assembly">The <see cref="Assembly"/>.</param>
@ -54,7 +44,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
var provideAttribute = assembly.GetCustomAttribute<ProvideApplicationPartFactoryAttribute>();
if (provideAttribute == null)
{
return ApplicationPartFactory.Default;
return DefaultApplicationPartFactory.Instance;
}
var type = provideAttribute.GetFactoryType();
@ -68,18 +58,5 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
return (ApplicationPartFactory)Activator.CreateInstance(type);
}
private class DefaultApplicationPartFactory : ApplicationPartFactory
{
public override IEnumerable<ApplicationPart> GetApplicationParts(Assembly assembly, string context)
{
if (assembly == null)
{
throw new ArgumentNullException(nameof(assembly));
}
yield return new AssemblyPart(assembly);
}
}
}
}

View File

@ -59,7 +59,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
foreach (var assembly in applicationAssemblies)
{
var partFactory = ApplicationPartFactory.GetApplicationPartFactory(assembly);
foreach (var part in partFactory.GetApplicationParts(assembly, context: ApplicationPartFactory.DefaultContextName))
foreach (var part in partFactory.GetApplicationParts(assembly))
{
ApplicationParts.Add(part);
}

View File

@ -0,0 +1,44 @@
// 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.Collections.Generic;
using System.Reflection;
namespace Microsoft.AspNetCore.Mvc.ApplicationParts
{
/// <summary>
/// Default <see cref="ApplicationPartFactory"/>.
/// </summary>
public class DefaultApplicationPartFactory : ApplicationPartFactory
{
/// <summary>
/// Gets an instance of <see cref="DefaultApplicationPartFactory"/>.
/// </summary>
public static DefaultApplicationPartFactory Instance { get; } = new DefaultApplicationPartFactory();
/// <summary>
/// Gets the sequence of <see cref="ApplicationPart"/> instances that are created by this instance of <see cref="DefaultApplicationPartFactory"/>.
/// <para>
/// Applications may use this method to get the same behavior as this factory produces during MVC's default part discovery.
/// </para>
/// </summary>
/// <param name="assembly">The <see cref="Assembly"/>.</param>
/// <returns>The sequence of <see cref="ApplicationPart"/> instances.</returns>
public static IEnumerable<ApplicationPart> GetDefaultApplicationParts(Assembly assembly)
{
if (assembly == null)
{
throw new ArgumentNullException(nameof(assembly));
}
yield return new AssemblyPart(assembly);
}
/// <inheritdoc />
public override IEnumerable<ApplicationPart> GetApplicationParts(Assembly assembly)
{
return GetDefaultApplicationParts(assembly);
}
}
}

View File

@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
public class NullApplicationPartFactory : ApplicationPartFactory
{
/// <inheritdoc />
public override IEnumerable<ApplicationPart> GetApplicationParts(Assembly assembly, string context)
public override IEnumerable<ApplicationPart> GetApplicationParts(Assembly assembly)
{
return Enumerable.Empty<ApplicationPart>();
}

View File

@ -50,10 +50,14 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
throw new ArgumentNullException(nameof(assembly));
}
return GetRelatedAssemblies(assembly, throwOnError, AssemblyLoadFileDelegate);
return GetRelatedAssemblies(assembly, throwOnError, File.Exists, AssemblyLoadFileDelegate);
}
internal static IReadOnlyList<Assembly> GetRelatedAssemblies(Assembly assembly, bool throwOnError, Func<string, Assembly> loadFile)
internal static IReadOnlyList<Assembly> GetRelatedAssemblies(
Assembly assembly,
bool throwOnError,
Func<string, bool> fileExists,
Func<string, Assembly> loadFile)
{
if (assembly == null)
{
@ -74,7 +78,8 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
}
var assemblyName = assembly.GetName().Name;
var assemblyDirectory = Path.GetDirectoryName(assembly.CodeBase);
var assemblyLocation = GetAssemblyLocation(assembly);
var assemblyDirectory = Path.GetDirectoryName(assemblyLocation);
var relatedAssemblies = new List<Assembly>();
for (var i = 0; i < attributes.Length; i++)
@ -87,7 +92,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
}
var relatedAssemblyLocation = Path.Combine(assemblyDirectory, attribute.AssemblyFileName + ".dll");
if (!File.Exists(relatedAssemblyLocation))
if (!fileExists(relatedAssemblyLocation))
{
if (throwOnError)
{
@ -107,5 +112,15 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
return relatedAssemblies;
}
internal static string GetAssemblyLocation(Assembly assembly)
{
if (Uri.TryCreate(assembly.CodeBase, UriKind.Absolute, out var result) && result.IsFile)
{
return result.LocalPath;
}
return assembly.Location;
}
}
}

View File

@ -1,5 +1,5 @@
{
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.Core, Version=2.0.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"Types": [
{
"Name": "Microsoft.AspNetCore.Builder.MvcApplicationBuilderExtensions",
@ -19488,6 +19488,11 @@
"Name": "etag",
"Type": "Microsoft.Net.Http.Headers.EntityTagHeaderValue",
"DefaultValue": "null"
},
{
"Name": "enableRangeProcessing",
"Type": "System.Boolean",
"DefaultValue": "True"
}
],
"ReturnType": "System.ValueTuple<Microsoft.Net.Http.Headers.RangeItemHeaderValue, System.Int64, System.Boolean>",

View File

@ -1,5 +1,5 @@
{
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.Cors, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.Cors, Version=2.0.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"Types": [
{
"Name": "Microsoft.Extensions.DependencyInjection.MvcCorsMvcCoreBuilderExtensions",

View File

@ -1,5 +1,5 @@
{
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.DataAnnotations, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.DataAnnotations, Version=2.0.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"Types": [
{
"Name": "Microsoft.AspNetCore.Mvc.HiddenInputAttribute",

View File

@ -1,5 +1,5 @@
{
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.Formatters.Json, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.Formatters.Json, Version=2.0.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"Types": [
{
"Name": "Microsoft.AspNetCore.Mvc.JsonPatchExtensions",
@ -366,6 +366,14 @@
"Visibility": "Protected",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "get_PublicSerializerSettings",
"Parameters": [],
"ReturnType": "Newtonsoft.Json.JsonSerializerSettings",
"Visibility": "Public",
"GenericParameter": []
},
{
"Kind": "Method",
"Name": "WriteObject",

View File

@ -1,5 +1,5 @@
{
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.Formatters.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.Formatters.Xml, Version=2.0.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"Types": [
{
"Name": "Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.DataMemberRequiredBindingMetadataProvider",

View File

@ -1,5 +1,5 @@
{
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.Localization, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.Localization, Version=2.0.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"Types": [
{
"Name": "Microsoft.AspNetCore.Mvc.Localization.HtmlLocalizer",

View File

@ -12,8 +12,15 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
/// </summary>
public class CompiledRazorAssemblyApplicationPartFactory : ApplicationPartFactory
{
/// <inheritdoc />
public override IEnumerable<ApplicationPart> GetApplicationParts(Assembly assembly, string configuration)
/// <summary>
/// Gets the sequence of <see cref="ApplicationPart"/> instances that are created by this instance of <see cref="DefaultApplicationPartFactory"/>.
/// <para>
/// Applications may use this method to get the same behavior as this factory produces during MVC's default part discovery.
/// </para>
/// </summary>
/// <param name="assembly">The <see cref="Assembly"/>.</param>
/// <returns>The sequence of <see cref="ApplicationPart"/> instances.</returns>
public static IEnumerable<ApplicationPart> GetDefaultApplicationParts(Assembly assembly)
{
if (assembly == null)
{
@ -22,5 +29,8 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
yield return new CompiledRazorAssemblyPart(assembly);
}
/// <inheritdoc />
public override IEnumerable<ApplicationPart> GetApplicationParts(Assembly assembly) => GetDefaultApplicationParts(assembly);
}
}

View File

@ -1,5 +1,5 @@
{
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.Razor, Version=2.0.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"Types": [
{
"Name": "Microsoft.AspNetCore.Mvc.Razor.HelperResult",

View File

@ -1,5 +1,5 @@
{
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.RazorPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.RazorPages, Version=2.0.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"Types": [
{
"Name": "Microsoft.AspNetCore.Mvc.Internal.MvcRazorPagesDiagnosticSourceExtensions",

View File

@ -1,5 +1,5 @@
{
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.TagHelpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.TagHelpers, Version=2.0.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"Types": [
{
"Name": "Microsoft.AspNetCore.Mvc.Rendering.ValidationSummary",

View File

@ -1,5 +1,5 @@
{
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.ViewFeatures, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.ViewFeatures, Version=2.0.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"Types": [
{
"Name": "Microsoft.AspNetCore.Mvc.AutoValidateAntiforgeryTokenAttribute",
@ -17816,7 +17816,7 @@
},
{
"Kind": "Method",
"Name": "DateTimeInputTemplate",
"Name": "DateTimeOffsetTemplate",
"Parameters": [
{
"Name": "htmlHelper",

View File

@ -1,5 +1,5 @@
{
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.WebApiCompatShim, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc.WebApiCompatShim, Version=2.0.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"Types": [
{
"Name": "System.Net.Http.HttpRequestMessageExtensions",

View File

@ -1,5 +1,5 @@
{
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"AssemblyIdentity": "Microsoft.AspNetCore.Mvc, Version=2.0.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60",
"Types": [
{
"Name": "Microsoft.Extensions.DependencyInjection.MvcServiceCollectionExtensions",

View File

@ -67,20 +67,46 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
};
var relatedAssembly = typeof(RelatedAssemblyPartTest).Assembly;
try
var result = RelatedAssemblyAttribute.GetRelatedAssemblies(assembly, throwOnError: true, file => true, file =>
{
File.WriteAllBytes(destination, new byte[0]);
var result = RelatedAssemblyAttribute.GetRelatedAssemblies(assembly, throwOnError: true, file =>
{
Assert.Equal(file, destination);
return relatedAssembly;
});
Assert.Equal(new[] { relatedAssembly }, result);
}
finally
Assert.Equal(file, destination);
return relatedAssembly;
});
Assert.Equal(new[] { relatedAssembly }, result);
}
[Fact]
public void GetAssemblyLocation_UsesCodeBase()
{
// Arrange
var destination = Path.Combine(AssemblyDirectory, "RelatedAssembly.dll");
var codeBase = "file://x/file/Assembly.dll";
var expected = new Uri(codeBase).LocalPath;
var assembly = new TestAssembly
{
File.Delete(destination);
}
CodeBaseSettable = codeBase,
};
// Act
var actual = RelatedAssemblyAttribute.GetAssemblyLocation(assembly);
Assert.Equal(expected, actual);
}
[Fact]
public void GetAssemblyLocation_UsesLocation_IfCodeBaseIsNotLocal()
{
// Arrange
var destination = Path.Combine(AssemblyDirectory, "RelatedAssembly.dll");
var expected = Path.Combine(AssemblyDirectory, "Some-Dir", "Assembly.dll");
var assembly = new TestAssembly
{
CodeBaseSettable = "https://www.microsoft.com/test.dll",
LocationSettable = expected,
};
// Act
var actual = RelatedAssemblyAttribute.GetAssemblyLocation(assembly);
Assert.Equal(expected, actual);
}
private class TestAssembly : Assembly
@ -92,7 +118,13 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationParts
public string AttributeAssembly { get; set; }
public override string CodeBase => Path.Combine(AssemblyDirectory, "MyAssembly.dll");
public string CodeBaseSettable { get; set; } = Path.Combine(AssemblyDirectory, "MyAssembly.dll");
public override string CodeBase => CodeBaseSettable;
public string LocationSettable { get; set; } = Path.Combine(AssemblyDirectory, "MyAssembly.dll");
public override string Location => LocationSettable;
public override object[] GetCustomAttributes(Type attributeType, bool inherit)
{