10

尝试使用 Unity.Mvc5 和使用 Identity 2.0 和 Identity 2.0 Samples 样板的 MVC 5 应用程序配置 Unity 时,出现以下异常。我已阅读此 SO Configure Unity DI for ASP.NET Identity,但我仍然不清楚我缺少什么。我在这里做错了什么?

当前类型 System.Data.Common.DbConnection 是一个抽象类,无法构造。您是否缺少类型映射?

[ResolutionFailedException: 依赖解析失败,type = "myApp.Web.Controllers.AccountController", name = "(none)"。异常发生时:解决时。

异常是: InvalidOperationException - 当前类型 System.Data.Common.DbConnection 是一个抽象类,无法构造。您是否缺少类型映射?

在异常发生时,容器是:

解析 myApp.Web.Controllers.AccountController,(none) 解析构造函数 myApp.Web.Controllers.AccountController(myApp.Web.Models.ApplicationUserManager userManager) 的参数 "userManager" 解析 myApp.Web.Models.ApplicationUserManager,(none) 解析参数构造函数 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.UserStore1[myApp.Web.DAL.Profiles.ApplicationUser],(none) 的“存储”(映射自 Microsoft.AspNet.Identity.IUserStore1[myApp.Web.DAL.Profiles.ApplicationUser], (none)) Resolving parameter "context" of constructor Microsoft.AspNet.Identity.EntityFramework.UserStore1[[myApp.Web.DAL.Profiles.ApplicationUser, myApp.Web, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]](System.Data.Entity.DbContext 上下文) 解析 System.Data.Entity.DbContext ,(none) 解析构造函数 System.Data.Entity.DbContext(System.Data.Common.DbConnection existingConnection, System.Data.Entity.Infrastructure.DbCompiledModel model, System.Boolean contextOwnsConnection) 的参数“existingConnection” 解析 System.Data.Common .DbConnection,(无)

帐户控制器,因为我已对其进行了修改

 public AccountController(ApplicationUserManager userManager)
 {
      _userManager = userManager;
 }

 private ApplicationUserManager _userManager;

我注册的容器

container.RegisterType<ApplicationUserManager>(new HierarchicalLifetimeManager());
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());
4

2 回答 2

22

我看到您找到了解决方案,但我想我有一个更简单的解决方案。

您正在使用实体框架,对吗?所以你的应用程序几乎可以肯定有一些继承自DbContext(可能继承自IdentityContext<TUser>,在这种情况下又继承自DbContext)。在默认模板中,它是 ApplicationDbContext。

在您的组合根中,您可以添加container.RegisterType<DbContext, ApplicationDbContext>(new HierarchicalLifetimeManager());(如果您的不称为 ApplicationDbContext,则显然编辑它)。

于 2014-04-23T13:19:48.343 回答
2

好的,我想通了。我想。我创建了自己的用户存储类并将其插入。这有点帮助。http://odetocode.com/blogs/scott/archive/2014/01/20/implementing-asp-net-identity.aspx

统一配置

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();
    }
}
于 2014-04-22T17:22:30.497 回答