Я создал проект веб-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. Убедитесь, что в контроллере есть открытый конструктор без параметров.

0
user9657450 9 Ноя 2018 в 21:06

2 ответа

Лучший ответ

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

  • если вы используете ASP.NET Framework, это может быть - Global.asax или Startap.cs (Owin) через метод UnityConfig.RegisterComponents().
  • если вы используете ASP.NET Core, то в файле Startup.cs (мне не удалось найти официальных руководств по его настройке)
2
Rustam Ashurov 9 Ноя 2018 в 22:40

У вашего текущего конструктора есть параметры (или, если хотите, аргументы).

Видеть:

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

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

public AccountController()
{
}

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

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

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

-1
Royal Kitsune 9 Ноя 2018 в 18:25