Add builder extensions to simplify use of `CookieTempDataProvider`
- #5515
This commit is contained in:
parent
576c0e6a65
commit
6d4361218e
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue