Updates to AddManager behavior

This commit is contained in:
Hao Kung 2015-08-21 12:56:35 -07:00
parent 902de1599c
commit 4e0000163b
4 changed files with 79 additions and 2 deletions

View File

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Reflection;
using Microsoft.Framework.DependencyInjection;
namespace Microsoft.AspNet.Identity
@ -159,7 +160,15 @@ namespace Microsoft.AspNet.Identity
/// <returns>The <see cref="IdentityBuilder"/>.</returns>
public virtual IdentityBuilder AddUserManager<TUserManager>() where TUserManager : class
{
return AddScoped(typeof(UserManager<>).MakeGenericType(UserType), typeof(TUserManager));
var userManagerType = typeof(UserManager<>).MakeGenericType(UserType);
var customType = typeof(TUserManager);
if (userManagerType == customType ||
!userManagerType.GetTypeInfo().IsAssignableFrom(customType.GetTypeInfo()))
{
throw new InvalidOperationException(Resources.FormatInvalidManagerType(customType.Name, "UserManager", UserType.Name));
}
Services.AddScoped(customType, services => services.GetRequiredService(userManagerType));
return AddScoped(userManagerType, customType);
}
/// <summary>
@ -169,7 +178,15 @@ namespace Microsoft.AspNet.Identity
/// <returns>The <see cref="IdentityBuilder"/>.</returns>
public virtual IdentityBuilder AddRoleManager<TRoleManager>() where TRoleManager : class
{
return AddScoped(typeof(RoleManager<>).MakeGenericType(RoleType), typeof(TRoleManager));
var managerType = typeof(RoleManager<>).MakeGenericType(RoleType);
var customType = typeof(TRoleManager);
if (managerType == customType ||
!managerType.GetTypeInfo().IsAssignableFrom(customType.GetTypeInfo()))
{
throw new InvalidOperationException(Resources.FormatInvalidManagerType(customType.Name, "RoleManager", RoleType.Name));
}
Services.AddScoped(typeof(TRoleManager), services => services.GetRequiredService(managerType));
return AddScoped(managerType, typeof(TRoleManager));
}
}
}

View File

@ -122,6 +122,22 @@ namespace Microsoft.AspNet.Identity
return string.Format(CultureInfo.CurrentCulture, GetString("InvalidEmail"), p0);
}
/// <summary>
/// Type {0} must be derived from {1}&lt;{2}&gt;.
/// </summary>
internal static string InvalidManagerType
{
get { return GetString("InvalidManagerType"); }
}
/// <summary>
/// Type {0} must be derived from {1}&lt;{2}&gt;.
/// </summary>
internal static string FormatInvalidManagerType(object p0, object p1, object p2)
{
return string.Format(CultureInfo.CurrentCulture, GetString("InvalidManagerType"), p0, p1, p2);
}
/// <summary>
/// The provided PasswordHasherCompatibilityMode is invalid.
/// </summary>

View File

@ -145,6 +145,10 @@
<value>Email '{0}' is invalid.</value>
<comment>Invalid email</comment>
</data>
<data name="InvalidManagerType" xml:space="preserve">
<value>Type {0} must be derived from {1}&lt;{2}&gt;.</value>
<comment>Error when the manager type is not derived correctly</comment>
</data>
<data name="InvalidPasswordHasherCompatibilityMode" xml:space="preserve">
<value>The provided PasswordHasherCompatibilityMode is invalid.</value>
<comment>Error when the password hasher doesn't understand the format it's being asked to produce.</comment>

View File

@ -31,6 +31,46 @@ namespace Microsoft.AspNet.Identity.Test
Assert.NotNull(manager.Options);
}
[Fact]
public void AddUserManagerWithCustomManagerReturnsSameInstance()
{
var services = new ServiceCollection()
.AddTransient<IUserStore<TestUser>, NoopUserStore>()
.AddSingleton<IHttpContextAccessor, HttpContextAccessor>()
.AddLogging();
services.AddIdentity<TestUser, TestRole>()
.AddUserManager<CustomUserManager>()
.AddRoleManager<CustomRoleManager>();
var provider = services.BuildServiceProvider();
Assert.Same(provider.GetRequiredService<UserManager<TestUser>>(),
provider.GetRequiredService<CustomUserManager>());
Assert.Same(provider.GetRequiredService<RoleManager<TestRole>>(),
provider.GetRequiredService<CustomRoleManager>());
}
[Fact]
public void AddManagerWithWrongTypesThrows()
{
var services = new ServiceCollection();
var builder = services.AddIdentity<TestUser, TestRole>();
Assert.Throws<InvalidOperationException>(() => builder.AddUserManager<UserManager<TestUser>>());
Assert.Throws<InvalidOperationException>(() => builder.AddRoleManager<RoleManager<TestRole>>());
Assert.Throws<InvalidOperationException>(() => builder.AddUserManager<object>());
Assert.Throws<InvalidOperationException>(() => builder.AddRoleManager<object>());
}
public class CustomUserManager : UserManager<TestUser>
{
public CustomUserManager() : base(new Mock<IUserStore<TestUser>>().Object, null, null, null, null, null, null, null, null, null)
{ }
}
public class CustomRoleManager : RoleManager<TestRole>
{
public CustomRoleManager() : base(new Mock<IRoleStore<TestRole>>().Object, null, null, null, null, null)
{ }
}
[Fact]
public async Task CreateCallsStore()
{