i get the following exception when trying to configure Unity using Unity.Mvc5 with an MVC 5 application using Identity 2.0 and the Identity 2.0 Samples boilerplate. i have read this SO Configure Unity DI for ASP.NET Identity and i'm still not clear on what i'm missing. What am i doing wrong here?
The current type, System.Data.Common.DbConnection, is an abstract class and cannot be constructed. Are you missing a type mapping?
[ResolutionFailedException: Resolution of the dependency failed, type = "myApp.Web.Controllers.AccountController", name = "(none)". Exception occurred while: while resolving.
At the time of the exception, the container was:
Resolving myApp.Web.Controllers.AccountController,(none)
Resolving parameter "userManager" of constructor myApp.Web.Controllers.AccountController(myApp.Web.Models.ApplicationUserManager userManager)
Resolving myApp.Web.Models.ApplicationUserManager,(none)
Resolving parameter "store" of constructor myApp.Web.Models.ApplicationUserManager(Microsoft.AspNet.Identity.IUserStore1[[myApp.Web.DAL.Profiles.ApplicationUser, myApp.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] store)
Resolving Microsoft.AspNet.Identity.EntityFramework.UserStore
1[myApp.Web.DAL.Profiles.ApplicationUser],(none) (mapped from Microsoft.AspNet.Identity.IUserStore1[myApp.Web.DAL.Profiles.ApplicationUser], (none))
Resolving parameter "context" of constructor Microsoft.AspNet.Identity.EntityFramework.UserStore
1[[myApp.Web.DAL.Profiles.ApplicationUser, myApp.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]](System.Data.Entity.DbContext context)
Resolving System.Data.Entity.DbContext,(none)
Resolving parameter "existingConnection" of constructor System.Data.Entity.DbContext(System.Data.Common.DbConnection existingConnection, System.Data.Entity.Infrastructure.DbCompiledModel model, System.Boolean contextOwnsConnection)
Resolving System.Data.Common.DbConnection,(none)
account controller as i have modified it
public AccountController(ApplicationUserManager userManager)
{
_userManager = userManager;
}
private ApplicationUserManager _userManager;
containers i have registered
container.RegisterType<ApplicationUserManager>(new HierarchicalLifetimeManager());
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());
I see you found a solution, but I think I have a simpler one.
You're using Entity Framework, right? So your application almost certainly has something inheriting from DbContext
(probably inheriting from IdentityContext<TUser>
, which in turn inherits from DbContext
in this case). In the default template it's ApplicationDbContext.
In your composition root you can just add container.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager());
(obviously edit this if yours isn't called ApplicationDbContext).
ok i figured it out. i think. i created my own userstore class and plugged it in. this was helpful somewhat. http://odetocode.com/blogs/scott/archive/2014/01/20/implementing-asp-net-identity.aspx
unity config
container.RegisterType<ApplicationDbContext>(new HierarchicalLifetimeManager());
container.RegisterType<IUserStore<ApplicationUser>, bcUserStore>(new HierarchicalLifetimeManager());
user manager
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new bcUserStore(context.Get<ApplicationDbContext>()));
// other code that's not relevant
}
user store
public class bcUserStore : IUserStore<ApplicationUser>
{
private IDbSet<ApplicationUser> _users;
private ApplicationDbContext _context;
public bcUserStore(ApplicationDbContext context)
{
_users = context.Users;
_context = context;
}
public System.Threading.Tasks.Task CreateAsync(ApplicationUser user)
{
user.Id = Guid.NewGuid().ToString();
_users.Add(user);
return _context.SaveChangesAsync();
}
public System.Threading.Tasks.Task DeleteAsync(ApplicationUser user)
{
_users.Remove(user);
return _context.SaveChangesAsync();
}
public System.Threading.Tasks.Task<ApplicationUser> FindByIdAsync(string userId)
{
return _users.FirstOrDefaultAsync(x => x.Id == userId);
}
public System.Threading.Tasks.Task<ApplicationUser> FindByNameAsync(string userName)
{
return _users.FirstOrDefaultAsync(x => x.UserName == userName);
}
public System.Threading.Tasks.Task UpdateAsync(ApplicationUser user)
{
var current = _users.Find(user.Id);
_context.Entry<ApplicationUser>(current).CurrentValues.SetValues(user);
return _context.SaveChangesAsync();
}
public void Dispose()
{
_users = null;
_context.Dispose();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With