Remove dependency on Hosting.Abstractions

This commit is contained in:
Ryan Brandenburg 2017-01-17 11:16:06 -08:00
parent e81627ba02
commit 65e3af98d5
5 changed files with 34 additions and 50 deletions

View File

@ -6,7 +6,6 @@ using System.Collections.Concurrent;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
using System.Resources; using System.Resources;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
namespace Microsoft.Extensions.Localization namespace Microsoft.Extensions.Localization
@ -24,29 +23,20 @@ namespace Microsoft.Extensions.Localization
private readonly IResourceNamesCache _resourceNamesCache = new ResourceNamesCache(); private readonly IResourceNamesCache _resourceNamesCache = new ResourceNamesCache();
private readonly ConcurrentDictionary<string, ResourceManagerStringLocalizer> _localizerCache = private readonly ConcurrentDictionary<string, ResourceManagerStringLocalizer> _localizerCache =
new ConcurrentDictionary<string, ResourceManagerStringLocalizer>(); new ConcurrentDictionary<string, ResourceManagerStringLocalizer>();
private readonly string _applicationName;
private readonly string _resourcesRelativePath; private readonly string _resourcesRelativePath;
/// <summary> /// <summary>
/// Creates a new <see cref="ResourceManagerStringLocalizer"/>. /// Creates a new <see cref="ResourceManagerStringLocalizer"/>.
/// </summary> /// </summary>
/// <param name="hostingEnvironment">The <see cref="IHostingEnvironment"/>.</param>
/// <param name="localizationOptions">The <see cref="IOptions{LocalizationOptions}"/>.</param> /// <param name="localizationOptions">The <see cref="IOptions{LocalizationOptions}"/>.</param>
public ResourceManagerStringLocalizerFactory( public ResourceManagerStringLocalizerFactory(
IHostingEnvironment hostingEnvironment,
IOptions<LocalizationOptions> localizationOptions) IOptions<LocalizationOptions> localizationOptions)
{ {
if (hostingEnvironment == null)
{
throw new ArgumentNullException(nameof(hostingEnvironment));
}
if (localizationOptions == null) if (localizationOptions == null)
{ {
throw new ArgumentNullException(nameof(localizationOptions)); throw new ArgumentNullException(nameof(localizationOptions));
} }
_applicationName = hostingEnvironment.ApplicationName;
_resourcesRelativePath = localizationOptions.Value.ResourcesPath ?? string.Empty; _resourcesRelativePath = localizationOptions.Value.ResourcesPath ?? string.Empty;
if (!string.IsNullOrEmpty(_resourcesRelativePath)) if (!string.IsNullOrEmpty(_resourcesRelativePath))
{ {
@ -162,7 +152,10 @@ namespace Microsoft.Extensions.Localization
throw new ArgumentNullException(nameof(baseName)); throw new ArgumentNullException(nameof(baseName));
} }
location = location ?? _applicationName; if (location == null)
{
throw new ArgumentNullException(nameof(location));
}
return _localizerCache.GetOrAdd($"B={baseName},L={location}", _ => return _localizerCache.GetOrAdd($"B={baseName},L={location}", _ =>
{ {

View File

@ -0,0 +1,9 @@
[
{
"OldTypeId": "public class Microsoft.Extensions.Localization.ResourceManagerStringLocalizerFactory : Microsoft.Extensions.Localization.IStringLocalizerFactory",
"OldMemberId": "public .ctor(Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment, Microsoft.Extensions.Options.IOptions<Microsoft.Extensions.Localization.LocalizationOptions> localizationOptions)",
"NewTypeId": "public class Microsoft.Extensions.Localization.ResourceManagerStringLocalizerFactory : Microsoft.Extensions.Localization.IStringLocalizerFactory",
"NewMemberId": "public .ctor(Microsoft.Extensions.Options.IOptions<Microsoft.Extensions.Localization.LocalizationOptions> localizationOptions)",
"Kind": "Modification"
}
]

View File

@ -0,0 +1,9 @@
[
{
"OldTypeId": "public class Microsoft.Extensions.Localization.ResourceManagerStringLocalizerFactory : Microsoft.Extensions.Localization.IStringLocalizerFactory",
"OldMemberId": "public .ctor(Microsoft.AspNetCore.Hosting.IHostingEnvironment hostingEnvironment, Microsoft.Extensions.Options.IOptions<Microsoft.Extensions.Localization.LocalizationOptions> localizationOptions)",
"NewTypeId": "public class Microsoft.Extensions.Localization.ResourceManagerStringLocalizerFactory : Microsoft.Extensions.Localization.IStringLocalizerFactory",
"NewMemberId": "public .ctor(Microsoft.Extensions.Options.IOptions<Microsoft.Extensions.Localization.LocalizationOptions> localizationOptions)",
"Kind": "Modification"
}
]

View File

@ -19,7 +19,6 @@
"xmlDoc": true "xmlDoc": true
}, },
"dependencies": { "dependencies": {
"Microsoft.AspNetCore.Hosting.Abstractions": "1.2.0-*",
"Microsoft.Extensions.DependencyInjection.Abstractions": "1.2.0-*", "Microsoft.Extensions.DependencyInjection.Abstractions": "1.2.0-*",
"Microsoft.Extensions.Localization.Abstractions": { "Microsoft.Extensions.Localization.Abstractions": {
"target": "project" "target": "project"

View File

@ -1,9 +1,9 @@
// Copyright (c) .NET Foundation. All rights reserved. // 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. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Moq; using Moq;
using Xunit; using Xunit;
@ -18,10 +18,9 @@ namespace Microsoft.Extensions.Localization.Tests
public string BaseName { get; private set; } public string BaseName { get; private set; }
public TestResourceManagerStringLocalizerFactory( public TestResourceManagerStringLocalizerFactory(
IHostingEnvironment hostingEnvironment,
IOptions<LocalizationOptions> localizationOptions, IOptions<LocalizationOptions> localizationOptions,
ResourceLocationAttribute resourceLocationAttribute) ResourceLocationAttribute resourceLocationAttribute)
: base(hostingEnvironment, localizationOptions) : base(localizationOptions)
{ {
_resourceLocationAttribute = resourceLocationAttribute; _resourceLocationAttribute = resourceLocationAttribute;
} }
@ -46,19 +45,15 @@ namespace Microsoft.Extensions.Localization.Tests
public void Create_OverloadsProduceSameResult() public void Create_OverloadsProduceSameResult()
{ {
// Arrange // Arrange
var hostingEnvironment = new Mock<IHostingEnvironment>();
hostingEnvironment.SetupGet(a => a.ApplicationName).Returns("TestApplication");
var locOptions = new LocalizationOptions(); var locOptions = new LocalizationOptions();
var options = new Mock<IOptions<LocalizationOptions>>(); var options = new Mock<IOptions<LocalizationOptions>>();
options.Setup(o => o.Value).Returns(locOptions); options.Setup(o => o.Value).Returns(locOptions);
var resourceLocationAttribute = new ResourceLocationAttribute(Path.Combine("My", "Resources")); var resourceLocationAttribute = new ResourceLocationAttribute(Path.Combine("My", "Resources"));
var typeFactory = new TestResourceManagerStringLocalizerFactory( var typeFactory = new TestResourceManagerStringLocalizerFactory(
hostingEnvironment.Object,
options.Object, options.Object,
resourceLocationAttribute); resourceLocationAttribute);
var stringFactory = new TestResourceManagerStringLocalizerFactory( var stringFactory = new TestResourceManagerStringLocalizerFactory(
hostingEnvironment.Object,
options.Object, options.Object,
resourceLocationAttribute); resourceLocationAttribute);
var type = typeof(ResourceManagerStringLocalizerFactoryTest); var type = typeof(ResourceManagerStringLocalizerFactoryTest);
@ -77,12 +72,10 @@ namespace Microsoft.Extensions.Localization.Tests
public void Create_FromType_ReturnsCachedResultForSameType() public void Create_FromType_ReturnsCachedResultForSameType()
{ {
// Arrange // Arrange
var hostingEnvironment = new Mock<IHostingEnvironment>();
hostingEnvironment.SetupGet(a => a.ApplicationName).Returns("TestApplication");
var locOptions = new LocalizationOptions(); var locOptions = new LocalizationOptions();
var options = new Mock<IOptions<LocalizationOptions>>(); var options = new Mock<IOptions<LocalizationOptions>>();
options.Setup(o => o.Value).Returns(locOptions); options.Setup(o => o.Value).Returns(locOptions);
var factory = new ResourceManagerStringLocalizerFactory(hostingEnvironment.Object, localizationOptions: options.Object); var factory = new ResourceManagerStringLocalizerFactory(localizationOptions: options.Object);
// Act // Act
var result1 = factory.Create(typeof(ResourceManagerStringLocalizerFactoryTest)); var result1 = factory.Create(typeof(ResourceManagerStringLocalizerFactoryTest));
@ -96,12 +89,10 @@ namespace Microsoft.Extensions.Localization.Tests
public void Create_FromType_ReturnsNewResultForDifferentType() public void Create_FromType_ReturnsNewResultForDifferentType()
{ {
// Arrange // Arrange
var hostingEnvironment = new Mock<IHostingEnvironment>();
hostingEnvironment.SetupGet(a => a.ApplicationName).Returns("TestApplication");
var locOptions = new LocalizationOptions(); var locOptions = new LocalizationOptions();
var options = new Mock<IOptions<LocalizationOptions>>(); var options = new Mock<IOptions<LocalizationOptions>>();
options.Setup(o => o.Value).Returns(locOptions); options.Setup(o => o.Value).Returns(locOptions);
var factory = new ResourceManagerStringLocalizerFactory(hostingEnvironment.Object, localizationOptions: options.Object); var factory = new ResourceManagerStringLocalizerFactory(localizationOptions: options.Object);
// Act // Act
var result1 = factory.Create(typeof(ResourceManagerStringLocalizerFactoryTest)); var result1 = factory.Create(typeof(ResourceManagerStringLocalizerFactoryTest));
@ -115,13 +106,11 @@ namespace Microsoft.Extensions.Localization.Tests
public void Create_FromType_ResourcesPathDirectorySeperatorToDot() public void Create_FromType_ResourcesPathDirectorySeperatorToDot()
{ {
// Arrange // Arrange
var hostingEnvironment = new Mock<IHostingEnvironment>();
var locOptions = new LocalizationOptions(); var locOptions = new LocalizationOptions();
locOptions.ResourcesPath = Path.Combine("My", "Resources"); locOptions.ResourcesPath = Path.Combine("My", "Resources");
var options = new Mock<IOptions<LocalizationOptions>>(); var options = new Mock<IOptions<LocalizationOptions>>();
options.Setup(o => o.Value).Returns(locOptions); options.Setup(o => o.Value).Returns(locOptions);
var factory = new TestResourceManagerStringLocalizerFactory( var factory = new TestResourceManagerStringLocalizerFactory(
hostingEnvironment.Object,
options.Object, options.Object,
resourceLocationAttribute: null); resourceLocationAttribute: null);
@ -136,12 +125,10 @@ namespace Microsoft.Extensions.Localization.Tests
public void Create_FromNameLocation_ReturnsCachedResultForSameNameLocation() public void Create_FromNameLocation_ReturnsCachedResultForSameNameLocation()
{ {
// Arrange // Arrange
var hostingEnvironment = new Mock<IHostingEnvironment>();
hostingEnvironment.SetupGet(a => a.ApplicationName).Returns("TestApplication");
var locOptions = new LocalizationOptions(); var locOptions = new LocalizationOptions();
var options = new Mock<IOptions<LocalizationOptions>>(); var options = new Mock<IOptions<LocalizationOptions>>();
options.Setup(o => o.Value).Returns(locOptions); options.Setup(o => o.Value).Returns(locOptions);
var factory = new ResourceManagerStringLocalizerFactory(hostingEnvironment.Object, localizationOptions: options.Object); var factory = new ResourceManagerStringLocalizerFactory(localizationOptions: options.Object);
var location = typeof(ResourceManagerStringLocalizer).GetTypeInfo().Assembly.FullName; var location = typeof(ResourceManagerStringLocalizer).GetTypeInfo().Assembly.FullName;
// Act // Act
@ -156,12 +143,10 @@ namespace Microsoft.Extensions.Localization.Tests
public void Create_FromNameLocation_ReturnsNewResultForDifferentName() public void Create_FromNameLocation_ReturnsNewResultForDifferentName()
{ {
// Arrange // Arrange
var hostingEnvironment = new Mock<IHostingEnvironment>();
hostingEnvironment.SetupGet(a => a.ApplicationName).Returns("TestApplication");
var locOptions = new LocalizationOptions(); var locOptions = new LocalizationOptions();
var options = new Mock<IOptions<LocalizationOptions>>(); var options = new Mock<IOptions<LocalizationOptions>>();
options.Setup(o => o.Value).Returns(locOptions); options.Setup(o => o.Value).Returns(locOptions);
var factory = new ResourceManagerStringLocalizerFactory(hostingEnvironment.Object, localizationOptions: options.Object); var factory = new ResourceManagerStringLocalizerFactory(localizationOptions: options.Object);
var location = typeof(ResourceManagerStringLocalizer).GetTypeInfo().Assembly.FullName; var location = typeof(ResourceManagerStringLocalizer).GetTypeInfo().Assembly.FullName;
// Act // Act
@ -176,12 +161,10 @@ namespace Microsoft.Extensions.Localization.Tests
public void Create_FromNameLocation_ReturnsNewResultForDifferentLocation() public void Create_FromNameLocation_ReturnsNewResultForDifferentLocation()
{ {
// Arrange // Arrange
var hostingEnvironment = new Mock<IHostingEnvironment>();
hostingEnvironment.SetupGet(a => a.ApplicationName).Returns("TestApplication");
var locOptions = new LocalizationOptions(); var locOptions = new LocalizationOptions();
var options = new Mock<IOptions<LocalizationOptions>>(); var options = new Mock<IOptions<LocalizationOptions>>();
options.Setup(o => o.Value).Returns(locOptions); options.Setup(o => o.Value).Returns(locOptions);
var factory = new ResourceManagerStringLocalizerFactory(hostingEnvironment.Object, localizationOptions: options.Object); var factory = new ResourceManagerStringLocalizerFactory(localizationOptions: options.Object);
var location1 = new AssemblyName(typeof(ResourceManagerStringLocalizer).GetTypeInfo().Assembly.FullName).Name; var location1 = new AssemblyName(typeof(ResourceManagerStringLocalizer).GetTypeInfo().Assembly.FullName).Name;
var location2 = new AssemblyName(typeof(ResourceManagerStringLocalizerFactoryTest).GetTypeInfo().Assembly.FullName).Name; var location2 = new AssemblyName(typeof(ResourceManagerStringLocalizerFactoryTest).GetTypeInfo().Assembly.FullName).Name;
@ -197,41 +180,32 @@ namespace Microsoft.Extensions.Localization.Tests
public void Create_FromNameLocation_ResourcesPathDirectorySeparatorToDot() public void Create_FromNameLocation_ResourcesPathDirectorySeparatorToDot()
{ {
// Arrange // Arrange
var hostingEnvironment = new Mock<IHostingEnvironment>();
hostingEnvironment.SetupGet(a => a.ApplicationName).Returns("Microsoft.Extensions.Localization.Tests");
var locOptions = new LocalizationOptions(); var locOptions = new LocalizationOptions();
locOptions.ResourcesPath = Path.Combine("My", "Resources"); locOptions.ResourcesPath = Path.Combine("My", "Resources");
var options = new Mock<IOptions<LocalizationOptions>>(); var options = new Mock<IOptions<LocalizationOptions>>();
options.Setup(o => o.Value).Returns(locOptions); options.Setup(o => o.Value).Returns(locOptions);
var factory = new TestResourceManagerStringLocalizerFactory( var factory = new TestResourceManagerStringLocalizerFactory(
hostingEnvironment.Object,
options.Object, options.Object,
resourceLocationAttribute: null); resourceLocationAttribute: null);
// Act // Act
var result1 = factory.Create("baseName", location: null); var result1 = factory.Create("baseName", location: "Microsoft.Extensions.Localization.Tests");
// Assert // Assert
Assert.Equal("Microsoft.Extensions.Localization.Tests.My.Resources.baseName", factory.BaseName); Assert.Equal("Microsoft.Extensions.Localization.Tests.My.Resources.baseName", factory.BaseName);
} }
[Fact] [Fact]
public void Create_FromNameLocation_NullLocationUsesApplicationPath() public void Create_FromNameLocation_NullLocationThrows()
{ {
// Arrange // Arrange
var hostingEnvironment = new Mock<IHostingEnvironment>();
hostingEnvironment.SetupGet(a => a.ApplicationName).Returns("Microsoft.Extensions.Localization.Tests");
var locOptions = new LocalizationOptions(); var locOptions = new LocalizationOptions();
var options = new Mock<IOptions<LocalizationOptions>>(); var options = new Mock<IOptions<LocalizationOptions>>();
options.Setup(o => o.Value).Returns(locOptions); options.Setup(o => o.Value).Returns(locOptions);
var factory = new ResourceManagerStringLocalizerFactory(hostingEnvironment.Object, localizationOptions: options.Object); var factory = new ResourceManagerStringLocalizerFactory(localizationOptions: options.Object);
// Act // Act & Assert
var result1 = factory.Create("baseName", location: null); Assert.Throws<ArgumentNullException>(() => factory.Create("baseName", location: null));
var result2 = factory.Create("baseName", location: null);
// Assert
Assert.Same(result1, result2);
} }
} }
} }