【问题标题】:Pass parameter when initialising Dependency Injection in ASP.NET core在 ASP.NET 核心中初始化依赖注入时传递参数
【发布时间】:2016-11-16 04:41:57
【问题描述】:

我有一个简单的类,如下所示:

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;
    }
}

我想在一个简单的 ASP.NET 核心 Web 应用程序中使用内置 DI 注入它,但在初始化依赖注入时设置了“testString”参数。

我尝试在startup.cs 中设置以下内容,但在运行时失败,因为 TestClass1 没有无参数构造函数:

services.AddScoped(provider => new TestClass1("Success!")); 

【问题讨论】:

  • 你的问题没有意义;您发布的代码可以正常工作。您可能在问题中遗漏了一些重要信息,但我无法确定您遗漏了什么。请发布您获得的异常详细信息(异常类型、消息、堆栈跟踪和内部异常详细信息)。
  • 你真的在注入这个类,你是否尝试像new TestClass() 那样用“new”来初始化它? DI 不是这样工作的
  • 你能发布你的 ConfigureServices 方法吗?
  • @Tseng:当然,有时你需要直接注册一个类型的实例。所以这是一个常见的场景。正如 Steven 已经写的那样,它应该像这样工作。
  • @JuergenGutsch:不,你在获取实例时不要使用new关键字。你总是通过构造函数注入它。 DI 不是某种编译器魔法,它只是带有一些反射或 ExpressionTrees 的普通 CLR/OOP。我怀疑他在他的代码中使用了new TestClass()(注意 new 关键字并且没有参数)。这不是 DI 的工作方式。而是通过 public MyService(TestClass injectedTestCass) 之类的构造函数传递它

标签: c# dependency-injection asp.net-core .net-core


【解决方案1】:

我怀疑你只是错过了代码的关键部分,而且你对 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)
    {
    }
}

【讨论】:

  • 非常感谢。我试过你的一段代码,当然它有效。然后我检查了自己的代码,我的错误是将TestClass testClass 放在 ActionResult 方法中,而不是放在 Controller 构造方法中。还要感谢@steven 为我指明了正确的方向:)
  • 您应该在答案中添加您的用例和有问题的示例代码,然后它会比 猜测 错误可能是什么要快得多。对于 Actions,过去也有一种注入方法,在参数上使用 [FromServices] 属性。 docs.asp.net/en/latest/mvc/controllers/… 正如 GitHub 问题 github.com/aspnet/Mvc/issues/3578 中所指出的,这已更改了几次(即从属性和控制器中删除)。我不知道它是否仍然适用于动作参数
猜你喜欢
  • 2019-06-07
  • 2019-02-16
  • 2019-07-09
  • 2018-01-03
  • 1970-01-01
  • 2023-03-09
  • 2021-01-09
  • 2021-06-11
  • 1970-01-01
相关资源
最近更新 更多