尝试创建“ XXXXController”类型的控制器时发生错误。确保控制器具有无参数的公共构造函数

时间:2018-11-09 18:06:38

标签: asp.net asp.net-web-api unity-container

我创建了一个asp.net Web api项目,并分别在AccountController中实现了以下HTTP GET方法,并在AccountServiceAccountRepository中实现了相关的服务方法和存储库方法。

// WEB API 
public class AccountController : ApiController
{
    private readonly IAccountService _accountService;

    public AccountController(IAccountService accountService)
    {
        _accountService = accountService;
    }

    [HttpGet, ActionName("UserProfile")]
    public JsonResult<decimal> GetUserSalary(int userID)
    {
        var account = _accountService.GetUserSalary(userID);
        if (account != null)
        {
            return Json(account.Salary);
        }
        return Json(0);
    }
}

服务/业务层

public interface IAccountService
{
    decimal GetUserSalary(int userId);
}

public class AccountService : IAccountService
{
    readonly IAccountRepository _accountRepository = new AccountRepository();

    public decimal GetUserSalary(int userId)
    {
        return _accountRepository.GetUserSalary(userId);
    }
}

存储库/数据访问层

public interface IAccountRepository
{
    decimal GetUserSalary(int userId);
}

public class AccountRepository : IAccountRepository
{
    public decimal GetUserSalary(int userId)
    {
        using (var db = new AccountEntities())
        {
            var account = (from b in db.UserAccounts where b.UserID == userId select b).FirstOrDefault();
            if (account != null)
            {
                return account.Salary;
            }
        }
        return 0;
    }
}

UnityConfig

public static class UnityConfig
{
    public static void RegisterComponents()
    {
        var container = new UnityContainer();
        container.RegisterType<IAccountService, AccountService>();
        container.RegisterType<IAccountRepository, AccountRepository>();
        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
    }
}

但是当我调用API方法GetUserSalary()时,我得到一个错误提示

  

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

2 个答案:

答案 0 :(得分:2)

确认您没有忘记注册Unity IoC容器本身:

  • 如果您使用ASP.NET Framework,则可能是-通过UnityConfig.RegisterComponents()方法的Global.asax或Startap.cs(Owin)。
  • 如果您使用ASP.NET Core,则在Startup.cs文件中(我无法找到有关其配置的官方指南)

答案 1 :(得分:-1)

您当前的构造函数具有参数(或者您可以使用args)。

请参阅:

public AccountController(IAccountService accountService)
{
    _accountService = accountService;
}
  

您需要做的就是在控制器中添加一个“无参数构造函数”。

public AccountController()
{
}

无参数的构造函数通常在具有参数的构造函数之上,尽管据我所知,这仅是由于标准,而不是它可能引起的任何实际影响。

  

还有一个与此类似的已经存在的问题/问题,我将在下面链接,可能会提供更多详细信息。

Make sure that the controller has a parameterless public constructor error