我使用Unity成功为所有常规构造注射,如仓库等,但我不能让它与ASP.NET身份类的工作.设置是这样的:
public class AccountController : ApiController
{
private UserManager<ApplicationUser> _userManager { get; set; }
public AccountController(UserManager<ApplicationUser> userManager)
{
if (userManager == null) { throw new ArgumentNullException("userManager"); }
_userManager = userManager;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
使用Unity的这些配置:
unity.RegisterType<AccountController>();
unity.RegisterType<UserManager<ApplicationUser>>(new HierarchicalLifetimeManager());
unity.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(new HierarchicalLifetimeManager());
Run Code Online (Sandbox Code Playgroud)
这与Autofac,Ninject的其他帖子相同,例如,但在我的情况下它不起作用.错误消息是:
尝试创建"AccountController"类型的控制器时发生错误.确保控制器具有无参数的公共构造函数.手动创作当然是:
public AccountController()
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>("Mongo")))
{
}
Run Code Online (Sandbox Code Playgroud)
怎么了?
UPDATE
正如@emodendroket所建议的,缩短代码就可以了.不需要Unity.Mvc包.
unity.RegisterType<IUserStore<IdentityUser>,
MyCustomUserStore>(new HierarchicalLifetimeManager());
Run Code Online (Sandbox Code Playgroud)
和
public AccountController(UserManager<IdentityUser> _userManager,
IAccountRepository _account)
{
// ...
Run Code Online (Sandbox Code Playgroud) c# asp.net dependency-injection unity-container asp.net-identity
我这样ApplicationUserManager定义:
public class ApplicationUserManager : UserManager<ApplicationUser, int>
{
public ApplicationUserManager(IUserStore<ApplicationUser, int> store)
: base(store)
{
}
public override Task<IdentityResult> CreateAsync(ApplicationUser user, string password)
{
var result = base.CreateAsync(user, password);
//...
Repository.DoSomething(...); //Repository is null here
//..
}
[Dependency]
public IRepository Repository { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我的存储库没有被注入.Repository总是null
我的统一配置中也有这一行
.RegisterType<ApplicationUserManager>(new HierarchicalLifetimeManager())
Run Code Online (Sandbox Code Playgroud)
如何注射?
更新N:
这是我的控制器的代码; 我是怎么得到的UserManager:
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
} …Run Code Online (Sandbox Code Playgroud) dependency-injection unity-container asp.net-identity asp.net-web-api2