尝试使用Unity 2.0和Identity 2.0 Samples样板使用Unity.Mvc5和MVC 5应用程序配置Unity时出现以下异常。我已经阅读了这个Configure Unity DI for ASP.NET Identity,我仍然不清楚我错过了什么。我在这做错了什么?
当前类型System.Data.Common.DbConnection是一个抽象类,无法构造。你错过了类型映射吗?
[ResolutionFailedException:依赖项的解析失败,输入=" myApp.Web.Controllers.AccountController",name ="(none)"。 在解决时发生异常。
在例外时,容器是:
解析myApp.Web.Controllers.AccountController,(无)
解析参数" userManager"构造函数myApp.Web.Controllers.AccountController(myApp.Web.Models.ApplicationUserManager userManager)
解析myApp.Web.Models.ApplicationUserManager,(无)
解析参数" store"构造函数myApp.Web.Models.ApplicationUserManager(Microsoft.AspNet.Identity.IUserStore 1[[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)(从Microsoft.AspNet.Identity.IUserStore {{映射) 1}} [[myApp.Web.DAL.Profiles.ApplicationUser,myApp.Web,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]](System.Data.Entity.DbContext context)
解析System.Data.Entity.DbContext,(无)
解析参数" existingConnection"构造函数System.Data.Entity.DbContext(System.Data.Common.DbConnection existingConnection,System.Data.Entity.Infrastructure.DbCompiledModel model,System.Boolean contextOwnsConnection)
解析System.Data.Common.DbConnection,(无)
帐户控制器,因为我已经修改了它
1[myApp.Web.DAL.Profiles.ApplicationUser], (none))
Resolving parameter "context" of constructor Microsoft.AspNet.Identity.EntityFramework.UserStore
我已注册的容器
public AccountController(ApplicationUserManager userManager)
{
_userManager = userManager;
}
private ApplicationUserManager _userManager;
答案 0 :(得分:22)
我看到你找到了一个解决方案,但我认为我有一个更简单的解决方案。
您正在使用实体框架,对吧?因此,您的应用程序几乎肯定会继承自DbContext
(可能继承自IdentityContext<TUser>
,后者在本例中继承自DbContext
。在默认模板中,它是ApplicationDbContext。
在你的作品根目录中你可以添加container.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager());
(如果你的名字没有被称为ApplicationDbContext,显然可以编辑它。)
答案 1 :(得分:2)
统一配置
container.RegisterType<ApplicationDbContext>(new HierarchicalLifetimeManager());
container.RegisterType<IUserStore<ApplicationUser>, bcUserStore>(new HierarchicalLifetimeManager());
用户经理
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new bcUserStore(context.Get<ApplicationDbContext>()));
// other code that's not relevant
}
用户商店
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();
}
}