6

Я играю с проектом Asp.Net MVC 6 boilerplate. Я пытаюсь настроить инъекцию зависимости для одной из моих служб. Похоже, что встроенный контейнер IoC игнорирует мое привязку.Asp.net MVC плавная зависимость впрыска не работает

Startup.cs

public void ConfigureServices(IServiceCollection services){ 
    /*boilerplate's default bindings*/ 
    services.AddTransient<IDummy, Dummy>(p => new Dummy() 
     { 
      name = "from injection" 
     }); 
} 

HomeController.cs

public IActionResult Index(IDummy dummy){ 
    var test = dummy.name; 
    return this.View(HomeControllerAction.Index); 
} 

Исключение:

ArgumentException: Тип 'Presentation.WebUI.Controllers.IDummy' не имеют конструктор по умолчанию

Не могли бы вы рассказать мне, что я делаю неправильно?

ответ

7

Это исключение связано с тем, что структура не может связывать аргументы действия с интерфейсами.

Вы пытаетесь выполнить инъекцию в Action, когда среда по умолчанию использует инсталляцию конструктора.

Ссылка: Dependency Injection and Controllers

Constructor Injection

ASP.NET ядра встроенный в поддержку конструктора на основе зависимости впрыска распространяется на контроллерах MVC. Просто добавив тип сервиса к вашему контроллеру в качестве параметра конструктора, ASP.NET Core будет попытаться решить этот тип, используя свой встроенный контейнер обслуживания.

public class HomeController : Controller { 
    IDummy dummy; 
    public HomeController(IDummy dummy) { 
     this.dummy = dummy 
    } 

    public IActionResult Index(){ 
     var test = dummy.name; 
     return this.View(HomeControllerAction.Index); 
    } 
} 

ASP.NET MVC контроллеры ядра должны запросить их зависимости явно с помощью своих конструкторов. В некоторых случаях для отдельных действий контроллера может потребоваться услуга, и может не иметь смысла запрос на уровне контроллера. В этом случае вы также можете выбрать значение для ввода службы в качестве параметра в методе действий.

Action Injection with FromServices

Иногда вам не нужна услуга более одного действия в рамках контроллера. В этом случае может иметь смысл ввести услугу в качестве параметра к методу действия. Это делается путем маркировки параметр с атрибутом [FromServices], как показано здесь:

public IActionResult Index([FromServices] IDummy dummy) { 
    var test = dummy.name; 
    return this.View(HomeControllerAction.Index); 
} 
Смежные вопросы