У меня есть простой класс, который выглядит так:
public class TestClass1
{
private string testString = "Should be set by DI";
public TestClass1(string testString)
{
this.testString = testString;
}
public string GetData()
{
return testString + DateTime.Now;
}
}
Я хочу внедрить его с помощью встроенного DI в простое основное веб-приложение ASP.NET, но с параметром testString, установленным при инициализации внедрения зависимостей.
Я попытался установить следующее в startup.cs, но во время выполнения это не работает, потому что TestClass1 не имеет конструктора без параметров:
services.AddScoped(provider => new TestClass1("Success!"));
Ответ 1 · рейтинг 1 · Tseng
Я подозреваю, что вы просто пропустили важнейшую часть кода, и ваше использование DI просто неправильно, а не регистрация.
public class MyController
{
private readonly MyClass myClass;
public MyController()
{
// This doesn't work and do not involve DI at all
// It will fail because MyClass has no parameterles constructor
this.myClass = new MyClass();
}
}
Вышеприведенное не сработает, потому что DI не является магией компилятора, которая позволяет вам волшебным образом внедрять зависимости при вызове new для типа.
public class MyController
{
private readonly MyClass myClass;
public MyController(MyClass myClass)
{
// This should work, because the IoC/DI Container creates the instance
// and pass it into the controller
this.myClass = myClass;
}
}
Когда вы используете DI/IoC, вы позволяете конструктору генерировать и создавать экземпляры объектов, поэтому вы никогда не вызываете new в своих классах обслуживания. Просто скажите в конструкторе, что вам нужен экземпляр какого-то типа или его интерфейс.
Изменить:
Раньше это работало в предыдущих версиях (бета-версиях) ASP.NET Core. Должен по-прежнему работать, но ограничен параметрами:
public class MyController
{
public IActionResult Index([FromServices]MyClass myClass)
{
}
}