【问题标题】:Cannot figure out why Unity is not injecting Identity DbContext properly无法弄清楚为什么 Unity 没有正确注入 Identity DbContext
【发布时间】:2015-08-07 05:04:22
【问题描述】:

我是 Unity 和 Identity 的新手,我已经重组了 Identity 2 的实现以使用 int 键而不是字符串。我关注了this article。在这一点上效果很好。但是,我正在使用 Unity for IoC,它与我的存储库完美配合,但是,我正在努力让它与 Identity 方面一起工作。我跟着this article 切换。

我见过与此类似的问题,但他们都使用字符串键,所以我认为我在使用 int 的地方有一些时髦的东西。

问题出在 ApplicationUserStore 类的 ctor 中:

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)));

当我尝试运行应用程序时,ApplicationUserStore 的 ctor 中的 context 参数是 null

如果能提供任何帮助,我将不胜感激。

谢谢!

【问题讨论】:

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


    【解决方案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 无法解析对象并引发异常时失败。通过阅读异常的详细信息,您可以找到问题所在。如果您需要将来的帮助,也只需提交例外。

    【讨论】:

    • 谢谢。当我尝试你的建议时,我得到:Error: 'Owin.IAppBuilder' does not contain a definition for 'CreatePerOwinContext' and the best extension method overload 'Owin.AppBuilderExtensions.CreatePerOwinContext&lt;T&gt;(Owin.IAppBuilder, System.Func&lt;Microsoft.AspNet.Identity.Owin.IdentityFactoryOptions&lt;T&gt;, Microsoft.Owin.IOwinContext, T&gt;)' has some invalid arguments 这是给我这个错误的编辑行:app.CreatePerOwinContext&lt;ApplicationUserManager&gt;(UnityConfig.GetConfiguredContainer().Resolve&lt;ApplicationUserManager&gt;());
    • 您似乎以错误的方式编辑代码。试试这个不是你的:app.CreatePerOwinContext&lt;ApplicationUserManager&gt;(() =&gt; UnityConfig.GetConfiguredContainer().Resolve&lt;ApplicationUserManager&gt;());
    • 你实际上省略了()=&gt;
    • 对不起。当我最初使用()=&gt; 输入它时,我收到了一个错误。显然我有一个错字,因为现在这个问题似乎已经解决了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-02-06
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多