为ASP.NET身份配置Unity DI

时间:2014-02-21 07:16:34

标签: c# asp.net dependency-injection unity-container asp.net-identity

我正在成功地使用Unity进行所有常规构造函数注入,例如存储库等,但我无法使用ASP.NET Identity类。设置如下:

public class AccountController : ApiController
{
    private UserManager<ApplicationUser> _userManager { get; set; }

    public AccountController(UserManager<ApplicationUser> userManager)
    {
        if (userManager == null) { throw new ArgumentNullException("userManager"); }
        _userManager = userManager;
    }

    // ...
}

使用Unity的这些配置:

unity.RegisterType<AccountController>();
unity.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager());
unity.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());

这与Autofac,Ninject的其他帖子相同,例如,但它在我的情况下不起作用。错误消息是:

  

尝试创建“AccountController”类型的控制器时发生错误。确保控制器具有无参数的公共构造函数。   手动创作当然是:

public AccountController()
    : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>("Mongo")))
{
}

怎么了?

更新

根据@emodendroket的建议,缩短代码就可以了。不需要Unity.Mvc包。

unity.RegisterType<IUserStore<IdentityUser>, 
  MyCustomUserStore>(new HierarchicalLifetimeManager());

public AccountController(UserManager<IdentityUser> _userManager,
  IAccountRepository _account)
{
    // ...

4 个答案:

答案 0 :(得分:21)

您还需要解析 UserManager 。以下是如何使用 UserManager RoleManager 执行此操作的示例。在这个示例中,我使用常规的Unity 3软件包而不是其中一个派生或引导程序(过去有一些问题)。

<强>的AccountController

private readonly UserManager<ApplicationUser> _userManager;

private readonly RoleManager<IdentityRole> _roleManager;

public AccountController(IUserStore<ApplicationUser> userStore, IRoleStore<IdentityRole> roleStore)
{
  _userManager = new UserManager<ApplicationUser>(userStore);
  _roleManager = new RoleManager<IdentityRole>(roleStore);
}

Unity Bootstrapper

var accountInjectionConstructor = new InjectionConstructor(new IdentitySampleDbModelContext(configurationStore));
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(accountInjectionConstructor);
container.RegisterType<IRoleStore<IdentityRole>, RoleStore<IdentityRole>>(accountInjectionConstructor);

答案 1 :(得分:14)

正如blog post from enterpriseframework.com所说:

首先,为ASP.NET MVC Nuget包添加Unity Bootstrapper。

  1. 在Visual Studio&#34;解决方案资源管理器&#34; &GT;右键单击您的Web项目&#34;参考文献&#34;节点&gt;点击&#34;管理NuGet包&#34;。

  2. 从左侧菜单中选择在线&gt;所有

  3. 在右上角的搜索框中&gt;在线搜索(Ctrl + E)&gt;类型&#34; ASP.NET MVC的Unity引导程序&#34;。
  4. 为ASP.NET MVC选择&#34; Unity Bootstrapper&#34;然后选择安装。
  5. 安装完成后单击“关闭”
  6. 然后修改your-Web-project/App_Start/UnityConfig.cs文件并更新using语句,如下所示:

        using System;
        using System.Data.Entity;
        using Microsoft.AspNet.Identity;
        using Microsoft.AspNet.Identity.EntityFramework;
        using Microsoft.Practices.Unity;
        using Microsoft.Practices.Unity.Configuration;
        using MicrosoftIdentity.Controllers;
        using MicrosoftIdentity.Models;
    

    最后,在同一个文件中,更新RegisterTypes方法,如下所示:

            public static void RegisterTypes(IUnityContainer container)
            {
                // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
                // container.LoadConfiguration();
    
                // TODO: Register your types here
                container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>();
                container.RegisterType<UserManager<ApplicationUser>>();
                container.RegisterType<DbContext, ApplicationDbContext>();
                container.RegisterType<ApplicationUserManager>();
                container.RegisterType<AccountController>(new InjectionConstructor());
            }
    

    HTH

答案 2 :(得分:-1)

Install-Package Unity.AspNet.WebApi

您需要在HttpConfiguration.DependencyResolver属性下注册Unity。这允许WebApi知道它需要使用Unity而不是反射来实现控制器。

最简单的方法是使用上面的nuget包。

答案 3 :(得分:-1)

AccountController

中替换此属性
public ApplicationUserManager UserManager
{
    get
    { 
        _userManager = new ApplicationUserManager(
                          new UserStore<ApplicationUser>(new ApplicationDbContext()));
        return _userManager ??
               Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
    }
    private set
    {
        _userManager = value;
    }
}