Add builder extensions to simplify use of `CookieTempDataProvider`

- #5515
This commit is contained in:
Doug Bunting 2016-11-08 15:31:32 -08:00
parent 576c0e6a65
commit 6d4361218e
6 changed files with 423 additions and 11 deletions

View File

@ -5,6 +5,7 @@ using System;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ViewComponents;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.Extensions.DependencyInjection.Extensions;
namespace Microsoft.Extensions.DependencyInjection
@ -18,7 +19,9 @@ namespace Microsoft.Extensions.DependencyInjection
/// Adds configuration of <see cref="MvcViewOptions"/> for the application.
/// </summary>
/// <param name="builder">The <see cref="IMvcBuilder"/>.</param>
/// <param name="setupAction">The <see cref="MvcViewOptions"/> which need to be configured.</param>
/// <param name="setupAction">
/// An <see cref="Action{MvcViewOptions}"/> to configure the provided <see cref="MvcViewOptions"/>.
/// </param>
/// <returns>The <see cref="IMvcBuilder"/>.</returns>
public static IMvcBuilder AddViewOptions(
this IMvcBuilder builder,
@ -62,5 +65,57 @@ namespace Microsoft.Extensions.DependencyInjection
return builder;
}
/// <summary>
/// Registers <see cref="CookieTempDataProvider"/> as the default <see cref="ITempDataProvider"/> in the
/// <see cref="IServiceCollection"/>.
/// </summary>
/// <param name="builder">The <see cref="IMvcBuilder"/>.</param>
/// <returns>The <see cref="IMvcBuilder"/>.</returns>
public static IMvcBuilder AddCookieTempDataProvider(this IMvcBuilder builder)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
// Ensure the TempData basics are registered.
MvcViewFeaturesMvcCoreBuilderExtensions.AddViewServices(builder.Services);
var descriptor = ServiceDescriptor.Singleton(typeof(ITempDataProvider), typeof(CookieTempDataProvider));
builder.Services.Replace(descriptor);
return builder;
}
/// <summary>
/// Registers <see cref="CookieTempDataProvider"/> as the default <see cref="ITempDataProvider"/> in the
/// <see cref="IServiceCollection"/>.
/// </summary>
/// <param name="builder">The <see cref="IMvcBuilder"/>.</param>
/// <param name="setupAction">
/// An <see cref="Action{CookieTempDataProviderOptions}"/> to configure the provided
/// <see cref="CookieTempDataProviderOptions"/>.
/// </param>
/// <returns>The <see cref="IMvcBuilder"/>.</returns>
public static IMvcBuilder AddCookieTempDataProvider(
this IMvcBuilder builder,
Action<CookieTempDataProviderOptions> setupAction)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
if (setupAction == null)
{
throw new ArgumentNullException(nameof(setupAction));
}
AddCookieTempDataProvider(builder);
builder.Services.Configure(setupAction);
return builder;
}
}
}

View File

@ -33,6 +33,28 @@ namespace Microsoft.Extensions.DependencyInjection
return builder;
}
/// <summary>
/// Registers <see cref="CookieTempDataProvider"/> as the default <see cref="ITempDataProvider"/> in the
/// <see cref="IServiceCollection"/>. Also registers the default view services.
/// </summary>
/// <param name="builder">The <see cref="IMvcCoreBuilder"/>.</param>
/// <returns>The <see cref="IMvcCoreBuilder"/>.</returns>
public static IMvcCoreBuilder AddCookieTempDataProvider(this IMvcCoreBuilder builder)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
// Ensure the TempData basics are registered.
AddViewServices(builder.Services);
var descriptor = ServiceDescriptor.Singleton(typeof(ITempDataProvider), typeof(CookieTempDataProvider));
builder.Services.Replace(descriptor);
return builder;
}
private static void AddViewComponentApplicationPartsProviders(ApplicationPartManager manager)
{
if (!manager.FeatureProviders.OfType<ViewComponentFeatureProvider>().Any())
@ -55,14 +77,39 @@ namespace Microsoft.Extensions.DependencyInjection
throw new ArgumentNullException(nameof(setupAction));
}
builder.AddDataAnnotations();
AddViewServices(builder.Services);
AddViews(builder);
builder.Services.Configure(setupAction);
if (setupAction != null)
return builder;
}
/// <summary>
/// Registers <see cref="CookieTempDataProvider"/> as the default <see cref="ITempDataProvider"/> in the
/// <see cref="IServiceCollection"/>. Also registers the default view services.
/// </summary>
/// <param name="builder">The <see cref="IMvcCoreBuilder"/>.</param>
/// <param name="setupAction">
/// An <see cref="Action{CookieTempDataProviderOptions}"/> to configure the provided
/// <see cref="CookieTempDataProviderOptions"/>.
/// </param>
/// <returns>The <see cref="IMvcCoreBuilder"/>.</returns>
public static IMvcCoreBuilder AddCookieTempDataProvider(
this IMvcCoreBuilder builder,
Action<CookieTempDataProviderOptions> setupAction)
{
if (builder == null)
{
builder.Services.Configure(setupAction);
throw new ArgumentNullException(nameof(builder));
}
if (setupAction == null)
{
throw new ArgumentNullException(nameof(setupAction));
}
AddCookieTempDataProvider(builder);
builder.Services.Configure(setupAction);
return builder;
}

View File

@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using Microsoft.AspNetCore.Hosting;
@ -28,13 +29,11 @@ using Microsoft.AspNetCore.Mvc.ViewFeatures.Internal;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.ObjectPool;
using Microsoft.Extensions.Options;
using Moq;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json;
using Xunit;
using Microsoft.Extensions.ObjectPool;
using System.Diagnostics;
namespace Microsoft.AspNetCore.Mvc
{
@ -276,6 +275,35 @@ namespace Microsoft.AspNetCore.Mvc
}
}
[Fact]
public void AddMvc_RegistersExpectedTempDataProvider()
{
// Arrange
var services = new ServiceCollection();
// Act
services.AddMvc();
// Assert
var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(SessionStateTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddMvc_DoesNotRegisterCookieTempDataOptionsConfiguration()
{
// Arrange
var services = new ServiceCollection();
// Act
var builder = services.AddMvc();
// Assert
Assert.DoesNotContain(
services,
item => item.ServiceType == typeof(IConfigureOptions<CookieTempDataProviderOptions>));
}
private IEnumerable<Type> SingleRegistrationServiceTypes
{
get

View File

@ -8,6 +8,8 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApplicationParts;
using Microsoft.AspNetCore.Mvc.Internal;
using Microsoft.AspNetCore.Mvc.ViewComponents;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.Extensions.Options;
using Xunit;
namespace Microsoft.Extensions.DependencyInjection
@ -35,6 +37,100 @@ namespace Microsoft.Extensions.DependencyInjection
Assert.Equal(typeof(ServiceBasedViewComponentActivator), descriptor.ImplementationType);
}
[Fact]
public void AddCookieTempDataProvider_RegistersExpectedTempDataProvider()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvc();
// Act
builder.AddCookieTempDataProvider();
// Assert
var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddCookieTempDataProvider_DoesNotRegisterOptionsConfiguration()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvc();
// Act
builder.AddCookieTempDataProvider();
// Assert
Assert.DoesNotContain(
services,
item => item.ServiceType == typeof(IConfigureOptions<CookieTempDataProviderOptions>));
}
[Fact]
public void AddCookieTempDataProviderWithSetupAction_RegistersExpectedTempDataProvider()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvc();
// Act
builder.AddCookieTempDataProvider(options => { });
// Assert
var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddCookieTempDataProviderWithSetupAction_RegistersOptionsConfiguration()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvc();
// Act
builder.AddCookieTempDataProvider(options => { });
// Assert
Assert.Single(
services,
item => item.ServiceType == typeof(IConfigureOptions<CookieTempDataProviderOptions>));
}
[Fact]
public void AddCookieTempDataProvider_RegistersExpectedTempDataProvider_IfCalledTwice()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvc();
// Act
builder.AddCookieTempDataProvider();
builder.AddCookieTempDataProvider();
// Assert
var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddCookieTempDataProviderWithSetupAction_RegistersExpectedTempDataProvider_IfCalledTwice()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvc();
// Act
builder.AddCookieTempDataProvider(options => { });
builder.AddCookieTempDataProvider(options => { });
// Assert
var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddViewComponentsAsServices_RegistersDiscoveredViewComponents()
{

View File

@ -0,0 +1,186 @@
// 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 Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.Extensions.Options;
using Xunit;
namespace Microsoft.Extensions.DependencyInjection
{
public class MvcViewFeaturesMvcCoreBuilderExtensionsTest
{
[Fact]
public void AddViews_RegistersExpectedTempDataProvider()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvcCore();
// Act
builder.AddViews();
// Assert
var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(SessionStateTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddCookieTempDataProvider_RegistersExpectedTempDataProvider()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvcCore();
// Act
builder.AddCookieTempDataProvider();
// Assert
var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddCookieTempDataProvider_DoesNotRegisterOptionsConfiguration()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvcCore();
// Act
builder.AddCookieTempDataProvider();
// Assert
Assert.DoesNotContain(
services,
item => item.ServiceType == typeof(IConfigureOptions<CookieTempDataProviderOptions>));
}
[Fact]
public void AddCookieTempDataProviderWithSetupAction_RegistersExpectedTempDataProvider()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvcCore();
// Act
builder.AddCookieTempDataProvider(options => { });
// Assert
var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddCookieTempDataProviderWithSetupAction_RegistersOptionsConfiguration()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvcCore();
// Act
builder.AddCookieTempDataProvider(options => { });
// Assert
Assert.Single(
services,
item => item.ServiceType == typeof(IConfigureOptions<CookieTempDataProviderOptions>));
}
[Fact]
public void AddCookieTempDataProvider_RegistersExpectedTempDataProvider_IfCalledBeforeAddViews()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvcCore();
// Act
builder.AddCookieTempDataProvider();
builder.AddViews();
// Assert
var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddCookieTempDataProviderWithSetupAction_RegistersExpectedTempDataProvider_IfCalledBeforeAddViews()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvcCore();
// Act
builder.AddCookieTempDataProvider(options => { });
builder.AddViews();
// Assert
var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddCookieTempDataProvider_RegistersExpectedTempDataProvider_IfCalledAfterAddViews()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvcCore();
// Act
builder.AddViews();
builder.AddCookieTempDataProvider();
// Assert
var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddCookieTempDataProviderWithSetupAction_RegistersExpectedTempDataProvider_IfCalledAfterAddViews()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvcCore();
// Act
builder.AddViews();
builder.AddCookieTempDataProvider(options => { });
// Assert
var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddCookieTempDataProvider_RegistersExpectedTempDataProvider_IfCalledTwice()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvcCore();
// Act
builder.AddCookieTempDataProvider();
builder.AddCookieTempDataProvider();
// Assert
var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
}
[Fact]
public void AddCookieTempDataProviderWithSetupAction_RegistersExpectedTempDataProvider_IfCalledTwice()
{
// Arrange
var services = new ServiceCollection();
var builder = services.AddMvcCore();
// Act
builder.AddCookieTempDataProvider(options => { });
builder.AddCookieTempDataProvider(options => { });
// Assert
var descriptor = Assert.Single(services, item => item.ServiceType == typeof(ITempDataProvider));
Assert.Equal(typeof(CookieTempDataProvider), descriptor.ImplementationType);
}
}
}

View File

@ -2,7 +2,6 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.Extensions.DependencyInjection;
namespace BasicWebSite
@ -11,8 +10,9 @@ namespace BasicWebSite
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton<ITempDataProvider, CookieTempDataProvider>();
services
.AddMvc()
.AddCookieTempDataProvider();
}
public void Configure(IApplicationBuilder app)