Fix #4998 - Resolve IViewComponentHelper every time

This change resolves the scoped IViewComponentHelper every time its
needed, rather than misusing a shared instance. IViewComponentHelper is
stateful, so sharing an instance was the cause of this bug.
This commit is contained in:
Ryan Nowak 2016-07-20 09:42:30 -07:00
parent 8a6e99c7c0
commit bc76c0ef31
1 changed files with 6 additions and 10 deletions

View File

@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Mvc.Internal;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
@ -22,11 +23,9 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
private readonly ILogger<ViewComponentResult> _logger;
private readonly IModelMetadataProvider _modelMetadataProvider;
private readonly ITempDataDictionaryFactory _tempDataDictionaryFactory;
private readonly IViewComponentHelper _viewComponentHelper;
public ViewComponentResultExecutor(
IOptions<MvcViewOptions> mvcHelperOptions,
IViewComponentHelper viewComponentHelper,
ILoggerFactory loggerFactory,
HtmlEncoder htmlEncoder,
IModelMetadataProvider modelMetadataProvider,
@ -37,11 +36,6 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
throw new ArgumentNullException(nameof(mvcHelperOptions));
}
if (viewComponentHelper == null)
{
throw new ArgumentNullException(nameof(viewComponentHelper));
}
if (loggerFactory == null)
{
throw new ArgumentNullException(nameof(loggerFactory));
@ -63,7 +57,6 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
}
_htmlHelperOptions = mvcHelperOptions.Value.HtmlHelperOptions;
_viewComponentHelper = viewComponentHelper;
_logger = loggerFactory.CreateLogger<ViewComponentResult>();
_htmlEncoder = htmlEncoder;
_modelMetadataProvider = modelMetadataProvider;
@ -112,8 +105,11 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
writer,
_htmlHelperOptions);
(_viewComponentHelper as IViewContextAware)?.Contextualize(viewContext);
var result = await GetViewComponentResult(_viewComponentHelper, _logger, viewComponentResult);
// IViewComponentHelper is stateful, we want to make sure to retrieve it every time we need it.
var viewComponentHelper = context.HttpContext.RequestServices.GetRequiredService<IViewComponentHelper>();
(viewComponentHelper as IViewContextAware)?.Contextualize(viewContext);
var result = await GetViewComponentResult(viewComponentHelper, _logger, viewComponentResult);
result.WriteTo(writer, _htmlEncoder);
}