Make ViewLocalizer base name generation more efficient:

- Because @pranavkm made me do it
- And it is actually faster and less allocating than the old code (~25% faster)
- Added some more test cases
This commit is contained in:
damianedwards 2015-12-21 16:15:13 -08:00
parent 9364f896b3
commit ce0e35ff75
2 changed files with 18 additions and 12 deletions

View File

@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
using System.Text;
using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Mvc.ViewFeatures.Internal; using Microsoft.AspNet.Mvc.ViewFeatures.Internal;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
@ -97,7 +98,6 @@ namespace Microsoft.AspNet.Mvc.Localization
} }
// Given a view path "/Views/Home/Index.cshtml" we want a baseName like "MyApplication.Views.Home.Index" // Given a view path "/Views/Home/Index.cshtml" we want a baseName like "MyApplication.Views.Home.Index"
var path = viewContext.ExecutingFilePath; var path = viewContext.ExecutingFilePath;
if (string.IsNullOrEmpty(path)) if (string.IsNullOrEmpty(path))
@ -105,22 +105,26 @@ namespace Microsoft.AspNet.Mvc.Localization
path = viewContext.View.Path; path = viewContext.View.Path;
} }
// Trim the file extension from the end of the path
if (!string.IsNullOrEmpty(path) && Path.HasExtension(path))
{
var extension = Path.GetExtension(path);
path = path.Substring(0, path.Length - extension.Length);
}
Debug.Assert(!string.IsNullOrEmpty(path), "Couldn't determine a path for the view"); Debug.Assert(!string.IsNullOrEmpty(path), "Couldn't determine a path for the view");
var baseName = path.Replace('/', '.').Replace('\\', '.'); _localizer = _localizerFactory.Create(BuildBaseName(path), _applicationName);
baseName = baseName.TrimStart('.'); }
private string BuildBaseName(string path)
{
var extension = Path.GetExtension(path);
var startIndex = path[0] == '/' || path[0] == '\\' ? 1 : 0;
var length = path.Length - startIndex - extension.Length;
var capacity = length + _applicationName.Length + 1;
var builder = new StringBuilder(path, startIndex, length, capacity);
builder.Replace('/', '.').Replace('\\', '.');
// Prepend the application name // Prepend the application name
baseName = _applicationName + "." + baseName; builder.Insert(0, '.');
builder.Insert(0, _applicationName);
_localizer = _localizerFactory.Create(baseName, _applicationName); return builder.ToString();
} }
} }
} }

View File

@ -18,6 +18,8 @@ namespace Microsoft.AspNet.Mvc.Localization.Test
{ {
[Theory] [Theory]
[InlineData("TestApplication", "Views/Home/Index.cshtml", "Views/Home/Index.cshtml", "TestApplication.Views.Home.Index")] [InlineData("TestApplication", "Views/Home/Index.cshtml", "Views/Home/Index.cshtml", "TestApplication.Views.Home.Index")]
[InlineData("TestApplication", "/Views/Home/Index.cshtml", "/Views/Home/Index.cshtml", "TestApplication.Views.Home.Index")]
[InlineData("TestApplication", "\\Views\\Home\\Index.cshtml", "\\Views\\Home\\Index.cshtml", "TestApplication.Views.Home.Index")]
[InlineData("TestApplication.Web", "Views/Home/Index.cshtml", "Views/Home/Index.cshtml", "TestApplication.Web.Views.Home.Index")] [InlineData("TestApplication.Web", "Views/Home/Index.cshtml", "Views/Home/Index.cshtml", "TestApplication.Web.Views.Home.Index")]
[InlineData("TestApplication", "Views/Home/Index.cshtml", "Views/Shared/_Layout.cshtml", "TestApplication.Views.Shared._Layout")] [InlineData("TestApplication", "Views/Home/Index.cshtml", "Views/Shared/_Layout.cshtml", "TestApplication.Views.Shared._Layout")]
[InlineData("TestApplication", "Views/Home/Index.cshtml", "Views/Shared/_MyPartial.cshtml", "TestApplication.Views.Shared._MyPartial")] [InlineData("TestApplication", "Views/Home/Index.cshtml", "Views/Shared/_MyPartial.cshtml", "TestApplication.Views.Shared._MyPartial")]