无法弄清楚为什么Unity没有正确地注入Identity DbContext

时间:2015-08-07 05:04:23

标签: c# asp.net entity-framework unity-container asp.net-identity

我是Unity和Identity的新手,我重新构建了Identity 2的实现,使用int Keys而不是字符串。我跟着this article。它在这一点上很有用。但是,我正在使用Unity for IoC,它与我的存储库一起使用非常好,但是,我正在努力让它与Identity端一起工作。我跟着this article切换了。

我见过与此类似的问题,但所有这些问题都使用了字符串键,所以我假设我在使用int时有一些时髦的东西。

问题出在ApplicationUserStore类的代码中:

public class ApplicationUserStore :
    UserStore<ApplicationUser, ApplicationRole, int,
    ApplicationUserLogin, ApplicationUserRole,
    ApplicationUserClaim>, IUserStore<ApplicationUser, int>,
    IDisposable
{
    public ApplicationUserStore(IdentityDb context)
        : base(context)
    {
    }
}

以下是IdentityDb.cs

public class IdentityDb : IdentityDbContext<ApplicationUser, ApplicationRole, int,
    ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
    public IdentityDb()
        : base("DefaultConnection")
    {
    }

    static IdentityDb()
    {
        // Set the database initializer which is run once during application start
        // This seeds the database with admin user credentials and admin role
        Database.SetInitializer<IdentityDb>(new IdentityDbInitializer()); 
    }

    public static IdentityDb Create()
    {
        return new IdentityDb();
    }
}

以下是UnityConfig.cs的相关部分:

container.RegisterType<IdentityDb>(new PerResolveLifetimeManager());
container.RegisterType<ApplicationSignInManager>();
container.RegisterType<ApplicationUserManager>();
container.RegisterType<ApplicationRoleManager>();
container.RegisterType<IAuthenticationManager>(
     new InjectionFactory(c=>HttpContext.Current.GetOwinContext().Authentication));
container.RegisterType<IUserStore<ApplicationUser, int>, ApplicationUserStore>(
     new InjectionConstructor(typeof(IdentityDb)));

当我尝试运行该应用时,context的ctor中的ApplicationUserStore参数为null

我很感激可以提供任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

解析UserManager时遇到异常。但MVC的Dependency解析器吞下它并返回null而不是object。

Startup.Auth.cs而不是

app.CreatePerOwinContext(() => 
     DependencyResolver.Current.GetService<ApplicationUserManager>()); 

写道:

app.CreatePerOwinContext(() => 
     UnityConfig.GetConfiguredContainer().Resolve<ApplicationUserManager>());
//Don't forget to add Microsoft.Practices.Unity namespace

当Unity无法解析对象并引发异常时,这会导致程序失败。通过阅读异常的详细信息,您可以找到问题。如果您需要将来的帮助,也可以提交异常。