From 81bc90e550101214ba4706cd14e6fdfe14ec271a Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 15 May 2014 16:04:26 -0700 Subject: [PATCH] Move extensions to Builder Also add DbContext concrete to AddEntity extension --- .../EntityServiceCollectionExtensions.cs | 28 --------------- .../IdentityBuilderExtensions.cs | 9 +++++ ...entityEntityServiceCollectionExtensions.cs | 28 +++++++++++++++ .../IdentitySqlContext.cs | 10 +++--- .../SqlUserStore.cs | 13 ++++--- .../IdentityBuilderExtensions.cs | 18 ++++++++++ .../IdentityServiceCollectionExtensions.cs | 15 ++++---- .../SqlUserStoreTest.cs | 34 ++++++------------- .../SignInManagerTest.cs | 11 +++--- 9 files changed, 89 insertions(+), 77 deletions(-) delete mode 100644 src/Microsoft.AspNet.Identity.Entity/EntityServiceCollectionExtensions.cs create mode 100644 src/Microsoft.AspNet.Identity.Entity/IdentityEntityServiceCollectionExtensions.cs create mode 100644 src/Microsoft.AspNet.Identity.Security/IdentityBuilderExtensions.cs diff --git a/src/Microsoft.AspNet.Identity.Entity/EntityServiceCollectionExtensions.cs b/src/Microsoft.AspNet.Identity.Entity/EntityServiceCollectionExtensions.cs deleted file mode 100644 index c8b308309f..0000000000 --- a/src/Microsoft.AspNet.Identity.Entity/EntityServiceCollectionExtensions.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNet.Identity; -using Microsoft.AspNet.Identity.Entity; -using Microsoft.Data.Entity; - -namespace Microsoft.Framework.DependencyInjection -{ - public static class EntityServiceCollectionExtensions - { - public static ServiceCollection AddEntity(this ServiceCollection services) - where TUser : User - { - services.AddScoped, UserStore>(); - services.AddScoped>(); - return services; - } - - public static ServiceCollection AddEntity(this ServiceCollection services) - where TUser : User where TContext : DbContext - { - services.AddEntity(); - services.AddScoped(); - return services; - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity.Entity/IdentityBuilderExtensions.cs b/src/Microsoft.AspNet.Identity.Entity/IdentityBuilderExtensions.cs index e4dcf72f22..5447f46ffe 100644 --- a/src/Microsoft.AspNet.Identity.Entity/IdentityBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Identity.Entity/IdentityBuilderExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Identity.Entity; +using Microsoft.Data.Entity; using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Identity @@ -26,5 +27,13 @@ namespace Microsoft.AspNet.Identity builder.Services.AddScoped>(); return builder; } + public static IdentityBuilder AddEntity(this IdentityBuilder builder) + where TUser : User where TContext : DbContext + { + builder.Services.AddScoped, UserStore>(); + builder.Services.AddScoped>(); + builder.Services.AddScoped(); + return builder; + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity.Entity/IdentityEntityServiceCollectionExtensions.cs b/src/Microsoft.AspNet.Identity.Entity/IdentityEntityServiceCollectionExtensions.cs new file mode 100644 index 0000000000..d47d25e6e0 --- /dev/null +++ b/src/Microsoft.AspNet.Identity.Entity/IdentityEntityServiceCollectionExtensions.cs @@ -0,0 +1,28 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Identity; +using Microsoft.AspNet.Identity.Entity; +using Microsoft.Data.Entity; + +namespace Microsoft.Framework.DependencyInjection +{ + public static class IdentityEntityServiceCollectionExtensions + { + //public static IdentityBuilder AddEntity(this ServiceCollection services) + // where TUser : User + //{ + // services.AddScoped, UserStore>(); + // services.AddScoped>(); + // return services; + //} + + //public static ServiceCollection AddEntity(this ServiceCollection services) + // where TUser : User where TContext : DbContext + //{ + // services.AddEntity(); + // services.AddScoped(); + // return services; + //} + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity.Entity/IdentitySqlContext.cs b/src/Microsoft.AspNet.Identity.Entity/IdentitySqlContext.cs index a17ca10aa9..e53e5c4e47 100644 --- a/src/Microsoft.AspNet.Identity.Entity/IdentitySqlContext.cs +++ b/src/Microsoft.AspNet.Identity.Entity/IdentitySqlContext.cs @@ -12,20 +12,22 @@ namespace Microsoft.AspNet.Identity.Entity { public IdentitySqlContext() { } public IdentitySqlContext(IServiceProvider serviceProvider) : base(serviceProvider) { } + public IdentitySqlContext(ImmutableDbContextOptions options) : base(options) { } + public IdentitySqlContext(IServiceProvider serviceProvider, ImmutableDbContextOptions options) : base(serviceProvider, options) { } } public class IdentitySqlContext : DbContext where TUser : User { - public DbSet Users { get; set; } public DbSet UserClaims { get; set; } //public DbSet Roles { get; set; } - public IdentitySqlContext(IServiceProvider serviceProvider) - : base(serviceProvider) { } - public IdentitySqlContext() { } + public IdentitySqlContext(IServiceProvider serviceProvider) : base(serviceProvider) { } + public IdentitySqlContext(ImmutableDbContextOptions options) : base(options) { } + public IdentitySqlContext(IServiceProvider serviceProvider, ImmutableDbContextOptions options) : base(serviceProvider, options) { } + protected override void OnConfiguring(DbContextOptions builder) { diff --git a/src/Microsoft.AspNet.Identity.Entity/SqlUserStore.cs b/src/Microsoft.AspNet.Identity.Entity/SqlUserStore.cs index 40c2283407..ce7b1e9fcb 100644 --- a/src/Microsoft.AspNet.Identity.Entity/SqlUserStore.cs +++ b/src/Microsoft.AspNet.Identity.Entity/SqlUserStore.cs @@ -13,23 +13,22 @@ using Microsoft.Data.Entity; namespace Microsoft.AspNet.Identity.Entity { - // Real Sql implementation - public class SqlUserStore : - UserStore + public class UserStore : UserStore where TUser : User { - public SqlUserStore(DbContext context) : base(context) { } + public UserStore(DbContext context) : base(context) { } } - public class UserStore : + public class UserStore : //IUserRoleStore, IUserPasswordStore, IQueryableUserStore, IUserClaimStore where TUser : User + where TContext : DbContext { private bool _disposed; - public UserStore(DbContext context) + public UserStore(TContext context) { if (context == null) { @@ -39,7 +38,7 @@ namespace Microsoft.AspNet.Identity.Entity AutoSaveChanges = true; } - public DbContext Context { get; private set; } + public TContext Context { get; private set; } /// /// If true will call SaveChanges after CreateAsync/UpdateAsync/DeleteAsync diff --git a/src/Microsoft.AspNet.Identity.Security/IdentityBuilderExtensions.cs b/src/Microsoft.AspNet.Identity.Security/IdentityBuilderExtensions.cs new file mode 100644 index 0000000000..18a5ec82c2 --- /dev/null +++ b/src/Microsoft.AspNet.Identity.Security/IdentityBuilderExtensions.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Identity.Security; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.Identity +{ + public static class IdentityBuilderExtensions + { + public static IdentityBuilder AddSecurity(this IdentityBuilder builder) + where TUser : class + { + builder.Services.AddScoped>(); + return builder; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Identity/IdentityServiceCollectionExtensions.cs b/src/Microsoft.AspNet.Identity/IdentityServiceCollectionExtensions.cs index 480509748d..ba9b32b5ee 100644 --- a/src/Microsoft.AspNet.Identity/IdentityServiceCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Identity/IdentityServiceCollectionExtensions.cs @@ -8,7 +8,7 @@ namespace Microsoft.Framework.DependencyInjection { public static class IdentityServiceCollectionExtensions { - public static ServiceCollection AddIdentity(this ServiceCollection services) + public static IdentityBuilder AddIdentity(this ServiceCollection services) where TUser : class where TRole : class { @@ -16,25 +16,26 @@ namespace Microsoft.Framework.DependencyInjection services.Add(IdentityServices.GetDefaultRoleServices()); services.AddTransient, IdentityOptionsSetup>(); services.AddSingleton, OptionsAccessor>(); - return services; + return new IdentityBuilder(services); } - public static ServiceCollection AddIdentity(this ServiceCollection services, Action> actionBuilder) + public static IdentityBuilder AddIdentity(this ServiceCollection services, Action> actionBuilder) where TUser : class where TRole : class { services.AddIdentity(); - actionBuilder(new IdentityBuilder(services)); - return services; + var builder = new IdentityBuilder(services); + actionBuilder(builder); + return builder; } - public static ServiceCollection AddIdentity(this ServiceCollection services) + public static IdentityBuilder AddIdentity(this ServiceCollection services) where TUser : class { return services.AddIdentity(); } - public static ServiceCollection AddIdentity(this ServiceCollection services, Action> actionBuilder) + public static IdentityBuilder AddIdentity(this ServiceCollection services, Action> actionBuilder) where TUser : class { return services.AddIdentity(actionBuilder); diff --git a/test/Microsoft.AspNet.Identity.Entity.Test/SqlUserStoreTest.cs b/test/Microsoft.AspNet.Identity.Entity.Test/SqlUserStoreTest.cs index 4e68c4b5d4..7d0ce694a8 100644 --- a/test/Microsoft.AspNet.Identity.Entity.Test/SqlUserStoreTest.cs +++ b/test/Microsoft.AspNet.Identity.Entity.Test/SqlUserStoreTest.cs @@ -22,14 +22,6 @@ namespace Microsoft.AspNet.Identity.Entity.Test public class SqlUserStoreTest { public class ApplicationUser : User { } - public class ApplicationUserManager : UserManager - { - public ApplicationUserManager(IServiceProvider services, IUserStore store, IOptionsAccessor options) : base(services, store, options) { } - } - public class ApplicationRoleManager : RoleManager - { - public ApplicationRoleManager(IServiceProvider services, IRoleStore store) : base(services, store) { } - } public class ApplicationDbContext : IdentitySqlContext { @@ -39,25 +31,17 @@ namespace Microsoft.AspNet.Identity.Entity.Test [Fact] public async Task EnsureStartupUsageWorks() { - IBuilder builder = new Microsoft.AspNet.Builder.Builder(new ServiceCollection().BuildServiceProvider()); - - //builder.UseServices(services => services.AddIdentity(s => - // s.AddEntity() - //{ + EnsureDatabase(); + IBuilder builder = new Builder.Builder(new ServiceCollection().BuildServiceProvider()); builder.UseServices(services => { - services.AddEntityFramework(); - services.AddInstance(CreateAppContext()); - services.AddIdentity(s => - { - s.AddEntity(); - s.AddUserManager(); - }); + services.AddEntityFramework().AddSqlServer(); + services.AddIdentity().AddEntity(); }); var userStore = builder.ApplicationServices.GetService>(); - var userManager = builder.ApplicationServices.GetService(); + var userManager = builder.ApplicationServices.GetService>(); Assert.NotNull(userStore); Assert.NotNull(userManager); @@ -88,14 +72,16 @@ namespace Microsoft.AspNet.Identity.Entity.Test var serviceProvider = services.BuildServiceProvider(); var db = new IdentitySqlContext(serviceProvider); - - // TODO: Recreate DB, doesn't support String ID or Identity context yet db.Database.EnsureCreated(); - // TODO: CreateAsync DB? return db; } + public static void EnsureDatabase() + { + CreateContext(); + } + public static ApplicationDbContext CreateAppContext() { var services = new ServiceCollection(); diff --git a/test/Microsoft.AspNet.Identity.Security.Test/SignInManagerTest.cs b/test/Microsoft.AspNet.Identity.Security.Test/SignInManagerTest.cs index fbe50a56a8..36c7a179ac 100644 --- a/test/Microsoft.AspNet.Identity.Security.Test/SignInManagerTest.cs +++ b/test/Microsoft.AspNet.Identity.Security.Test/SignInManagerTest.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Identity.Security.Test [InlineData(false)] public async Task VerifyAccountControllerSignIn(bool isPersistent) { - IBuilder app = new Microsoft.AspNet.Builder.Builder(new ServiceCollection().BuildServiceProvider()); + IBuilder app = new Builder.Builder(new ServiceCollection().BuildServiceProvider()); app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie @@ -48,10 +48,7 @@ namespace Microsoft.AspNet.Identity.Security.Test services.AddIdentity(s => { s.AddInMemory(); - s.AddUserManager(); - s.AddRoleManager(); - }); - services.AddTransient(); + }).AddSecurity(); }); // Act @@ -60,8 +57,8 @@ namespace Microsoft.AspNet.Identity.Security.Test UserName = "Yolo" }; const string password = "Yol0Sw@g!"; - var userManager = app.ApplicationServices.GetService(); - var signInManager = app.ApplicationServices.GetService(); + var userManager = app.ApplicationServices.GetService>(); + var signInManager = app.ApplicationServices.GetService>(); IdentityResultAssert.IsSuccess(await userManager.CreateAsync(user, password)); var result = await signInManager.PasswordSignInAsync(user.UserName, password, isPersistent, false);