Dependency injection 如何在webapi中注入webapi AccountController
我有默认构造函数和参数如下的构造函数:Dependency injection 如何在webapi中注入webapi AccountController,dependency-injection,unity-container,asp.net-web-api2,Dependency Injection,Unity Container,Asp.net Web Api2,我有默认构造函数和参数如下的构造函数: public class AccountController : ApiController { private const string LocalLoginProvider = "Local"; private ApplicationUserManager _userManager; public ISecureDataFormat<AuthenticationTicket> AccessTokenFormat {
public class AccountController : ApiController
{
private const string LocalLoginProvider = "Local";
private ApplicationUserManager _userManager;
public ISecureDataFormat<AuthenticationTicket> AccessTokenFormat { get; private set; }
[Dependency]
public IRepository Repository{ get; private set; }
public AccountController()
{
}
public AccountController(ApplicationUserManager userManager, ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
{
_userManager = userManager;
AccessTokenFormat = accessTokenFormat;
}
}
根据@IgorPashchuk suggeston更新1现在MyController
正在注射。
但AccountController并非如此。我删除了默认构造函数,但仍然得到错误
更新2通过取出第二个参数,我用参数更改构造函数:
public class AccountController : ApiController
{
private const string LocalLoginProvider = "Local";
private ApplicationUserManager _userManager;
[Dependency]
public IRepository Repository{ get; private set; }
public AccountController(ApplicationUserManager userManager)
{
_userManager = userManager;
}
}
这样我就可以让它工作了。我的理解是,这意味着Unity无法构造type
ISecureDataFormat您应该删除无参数构造函数
接下来,您需要配置一个自定义依赖项解析器,它将基本上包装您的Unity容器。看
之后,确保注册所有类型。例如,我没有看到ApplicationUserManager
的注册。您正在注册UserManager
,但不是ApplicationUserManager
,这是IoC容器将尝试解决的问题。ApplicationUserManager
是否存在:.RegisterType()
我还需要Unity.Mvc
软件包吗?好像我不再需要那个了?@sreginogemoh,你说得对。对不起,我错过了。第二个问题的答案是:视情况而定。你不需要它来达到这个目的。但是,您肯定需要创建一个自定义依赖项解析器,因为Web API不知道您的Unity容器。
public class MyController : ApiController
{
[Dependency]
public IRepository Repository { get; set; }
public IHttpActionResult Get()
{
var test = Repository.GetSomething(); // Repository is null here always
}
}
public class AccountController : ApiController
{
private const string LocalLoginProvider = "Local";
private ApplicationUserManager _userManager;
[Dependency]
public IRepository Repository{ get; private set; }
public AccountController(ApplicationUserManager userManager)
{
_userManager = userManager;
}
}