Произошла ошибка при попытке создать контроллер типа «XXXXController». Убедитесь, что у контроллера есть открытый конструктор без параметров - PullRequest
0 голосов
/ 09 ноября 2018

Я создал проект веб-API asp.net и реализовал приведенный ниже метод HTTP GET в AccountController и соответствующий метод обслуживания и метод хранилища в AccountService & AccountRepository соответственно.

// 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 голосов
/ 10 ноября 2018

Убедитесь, что вы не забыли зарегистрировать сам контейнер Unity IoC:

  • если вы используете ASP.NET Framework, это может быть - Global.asax или Startap.cs (Owin) с помощью метода UnityConfig.RegisterComponents().
  • если вы используете ASP.NET Core, то в файле Startup.cs (мне не удалось найти официальные руководства по его настройке)
0 голосов
/ 09 ноября 2018

Ваш текущий конструктор имеет параметры (или аргументы, если вы предпочитаете).

см

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

Все, что вам нужно сделать, это также добавить в контроллер «Конструктор без параметров».

public AccountController()
{
}

Конструкторы без параметров обычно выше тех, у которых есть параметры, хотя, насколько мне известно, это связано только со стандартами, а не с каким-либо фактическим эффектом, который он может вызвать.

Существует также уже существующая проблема / вопрос, аналогичный этому, который я приведу ниже и который может предоставить более подробную информацию.

Убедитесь, что в контроллере произошла ошибка открытого конструктора без параметров

...