IServiceProvider.GetService now returns null for missing services

Previously GetService would throw if the requested service was missing.
This commit updates MVC to account for the change in behavior.
This commit is contained in:
Stephen Halter 2014-10-15 19:33:46 -07:00
parent f8035d6b04
commit 54ac14fa0f
12 changed files with 41 additions and 22 deletions

View File

@ -89,7 +89,7 @@ namespace Microsoft.AspNet.Mvc
valueAccessor = (actionContext) =>
{
var serviceProvider = actionContext.HttpContext.RequestServices;
return serviceProvider.GetService(property.PropertyType);
return serviceProvider.GetRequiredService(property.PropertyType);
};
}

View File

@ -4,6 +4,7 @@
using System;
using System.Diagnostics;
using Microsoft.AspNet.Mvc.Core;
using Microsoft.Framework.DependencyInjection;
namespace Microsoft.AspNet.Mvc
{
@ -22,7 +23,7 @@ namespace Microsoft.AspNet.Mvc
public IFilter CreateInstance([NotNull] IServiceProvider serviceProvider)
{
var service = serviceProvider.GetService(ServiceType);
var service = serviceProvider.GetRequiredService(ServiceType);
var filter = service as IFilter;
if (filter == null)

View File

@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Mvc
var args =
initializeMethod.GetParameters()
.Select(p => services.GetService(p.ParameterType))
.Select(p => services.GetRequiredService(p.ParameterType))
.ToArray();
initializeMethod.Invoke(obj, args);

View File

@ -20,7 +20,7 @@ namespace Microsoft.AspNet.Mvc.Internal
/// <param name="serviceType">The type of service which needs to be searched for.</param>
public static void ThrowIfMvcNotRegistered(IServiceProvider services)
{
if (services.GetServiceOrNull(typeof(MvcMarkerService)) == null)
if (services.GetService(typeof(MvcMarkerService)) == null)
{
throw new InvalidOperationException(Resources.FormatUnableToFindServices(
"IServiceCollection.AddMvc()",

View File

@ -6,6 +6,7 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Reflection;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.Framework.DependencyInjection;
namespace Microsoft.AspNet.Mvc
{
@ -73,7 +74,7 @@ namespace Microsoft.AspNet.Mvc
valueAccessor = (viewContext) =>
{
var serviceProvider = viewContext.HttpContext.RequestServices;
var service = serviceProvider.GetService(property.PropertyType);
var service = serviceProvider.GetRequiredService(property.PropertyType);
if (typeof(ICanHasViewContext).IsAssignableFrom(property.PropertyType))
{
((ICanHasViewContext)service).Contextualize(viewContext);

View File

@ -6,6 +6,7 @@ using System.Collections.Concurrent;
using System.Reflection;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
using Microsoft.Framework.DependencyInjection;
namespace Microsoft.AspNet.Mvc.Razor
{
@ -52,7 +53,7 @@ namespace Microsoft.AspNet.Mvc.Razor
valueAccessor = (viewContext) =>
{
var serviceProvider = viewContext.HttpContext.RequestServices;
var service = serviceProvider.GetService(property.PropertyType);
var service = serviceProvider.GetRequiredService(property.PropertyType);
var contextable = service as ICanHasViewContext;
contextable?.Contextualize(viewContext);

View File

@ -97,7 +97,7 @@ namespace Microsoft.AspNet.Mvc.Razor
valueAccessor = context =>
{
var serviceProvider = context.HttpContext.RequestServices;
var value = serviceProvider.GetService(property.PropertyType);
var value = serviceProvider.GetRequiredService(property.PropertyType);
var canHasViewContext = value as ICanHasViewContext;
if (canHasViewContext != null)
{

View File

@ -5,6 +5,7 @@
using System;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Mvc.ModelBinding;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Routing;
using Moq;
using Xunit;
@ -17,12 +18,16 @@ namespace Microsoft.AspNet.Mvc.Core.Test
public void Activate_SetsPropertiesFromActionContextHierarchy()
{
// Arrange
var services = new Mock<IServiceProvider>();
services.Setup(s => s.GetService(typeof(IUrlHelper)))
.Returns(Mock.Of<IUrlHelper>());
var httpRequest = Mock.Of<HttpRequest>();
var httpContext = new Mock<HttpContext>();
httpContext.SetupGet(c => c.Request)
.Returns(httpRequest);
httpContext.SetupGet(c => c.RequestServices)
.Returns(Mock.Of<IServiceProvider>());
.Returns(services.Object);
var routeContext = new RouteContext(httpContext.Object);
var controller = new TestController();
var context = new ActionContext(routeContext, new ActionDescriptor())
@ -44,13 +49,17 @@ namespace Microsoft.AspNet.Mvc.Core.Test
public void Activate_SetsViewDatDictionary()
{
// Arrange
var service = new Mock<IServiceProvider>();
service.Setup(s => s.GetService(typeof(IModelMetadataProvider)))
.Returns(Mock.Of<IModelMetadataProvider>());
var services = new Mock<IServiceProvider>();
services.Setup(s => s.GetService(typeof(IModelMetadataProvider)))
.Returns(Mock.Of<IModelMetadataProvider>());
services.Setup(s => s.GetService(typeof(ICompositeViewEngine)))
.Returns(Mock.Of<ICompositeViewEngine>());
services.Setup(s => s.GetService(typeof(IUrlHelper)))
.Returns(Mock.Of<IUrlHelper>());
var httpContext = new Mock<HttpContext>();
httpContext.SetupGet(c => c.RequestServices)
.Returns(service.Object);
.Returns(services.Object);
var routeContext = new RouteContext(httpContext.Object);
var controller = new TestController();
var context = new ActionContext(routeContext, new ActionDescriptor())
@ -71,13 +80,13 @@ namespace Microsoft.AspNet.Mvc.Core.Test
{
// Arrange
var urlHelper = Mock.Of<IUrlHelper>();
var service = new Mock<IServiceProvider>();
service.Setup(s => s.GetService(typeof(IUrlHelper)))
.Returns(urlHelper);
var services = new Mock<IServiceProvider>();
services.Setup(s => s.GetService(typeof(IUrlHelper)))
.Returns(urlHelper);
var httpContext = new Mock<HttpContext>();
httpContext.SetupGet(c => c.RequestServices)
.Returns(service.Object);
.Returns(services.Object);
var routeContext = new RouteContext(httpContext.Object);
var controller = new TestController();
var context = new ActionContext(routeContext, new ActionDescriptor())
@ -97,11 +106,15 @@ namespace Microsoft.AspNet.Mvc.Core.Test
public void Activate_IgnoresPropertiesThatAreNotDecoratedWithActivateAttribute()
{
// Arrange
var services = new Mock<IServiceProvider>();
services.Setup(s => s.GetService(typeof(IUrlHelper)))
.Returns(Mock.Of<IUrlHelper>());
var httpContext = new Mock<HttpContext>();
httpContext.SetupGet(c => c.Response)
.Returns(Mock.Of<HttpResponse>());
httpContext.SetupGet(c => c.RequestServices)
.Returns(Mock.Of<IServiceProvider>());
.Returns(services.Object);
var routeContext = new RouteContext(httpContext.Object);
var controller = new TestController();
var context = new ActionContext(routeContext, new ActionDescriptor())

View File

@ -25,6 +25,7 @@ namespace Microsoft.AspNet.Mvc
var helper = Mock.Of<IHtmlHelper<object>>();
var serviceProvider = new Mock<IServiceProvider>();
serviceProvider.Setup(p => p.GetService(typeof(IHtmlHelper<object>))).Returns(helper);
serviceProvider.Setup(p => p.GetService(typeof(ICompositeViewEngine))).Returns(Mock.Of<ICompositeViewEngine>());
var viewContext = GetViewContext(serviceProvider.Object);
// Act
@ -44,6 +45,7 @@ namespace Microsoft.AspNet.Mvc
var helper = Mock.Of<IHtmlHelper<object>>();
var serviceProvider = new Mock<IServiceProvider>();
serviceProvider.Setup(p => p.GetService(typeof(IHtmlHelper<object>))).Returns(helper);
serviceProvider.Setup(p => p.GetService(typeof(ICompositeViewEngine))).Returns(Mock.Of<ICompositeViewEngine>());
var viewContext = GetViewContext(serviceProvider.Object);
// Act
@ -63,6 +65,7 @@ namespace Microsoft.AspNet.Mvc
var serviceProvider = new Mock<IServiceProvider>();
serviceProvider.Setup(p => p.GetService(typeof(IHtmlHelper<object>))).Returns(helper);
serviceProvider.Setup(p => p.GetService(typeof(MyService))).Returns(myTestService);
serviceProvider.Setup(p => p.GetService(typeof(ICompositeViewEngine))).Returns(Mock.Of<ICompositeViewEngine>());
var viewContext = GetViewContext(serviceProvider.Object);
var instance = new TestViewComponentWithCustomDataType();

View File

@ -34,8 +34,8 @@ namespace Microsoft.AspNet.Mvc
// Arrange
var services = new Mock<IServiceProvider>();
var expectedOutput = new MvcMarkerService();
services.Setup(o => o.GetService(typeof(IEnumerable<MvcMarkerService>)))
.Returns(new List<MvcMarkerService> { expectedOutput });
services.Setup(o => o.GetService(typeof(MvcMarkerService)))
.Returns(expectedOutput);
// Act & Assert
Assert.DoesNotThrow(() => MvcServicesHelper.ThrowIfMvcNotRegistered(services.Object));

View File

@ -223,8 +223,8 @@ namespace Microsoft.AspNet.Mvc
.Returns(invokerFactory);
httpContext.Setup(h => h.RequestServices.GetService(typeof(ILoggerFactory)))
.Returns(loggerFactory);
httpContext.Setup(h => h.RequestServices.GetService(typeof(IEnumerable<MvcMarkerService>)))
.Returns(new List<MvcMarkerService> { new MvcMarkerService() });
httpContext.Setup(h => h.RequestServices.GetService(typeof(MvcMarkerService)))
.Returns(new MvcMarkerService());
httpContext.Setup(h => h.RequestServices.GetService(typeof(IOptions<MvcOptions>)))
.Returns(optionsAccessor);

View File

@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Builder
{
public static Configuration GetTestConfiguration(this IApplicationBuilder app)
{
var configurationProvider = app.ApplicationServices.GetServiceOrDefault<ITestConfigurationProvider>();
var configurationProvider = app.ApplicationServices.GetService<ITestConfigurationProvider>();
var configuration = configurationProvider == null
? new Configuration()
: configurationProvider.Configuration;