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