如何通过引用依赖于DI ASP.NET核心2.0的另一个对象来实例化一个对象?

问题描述 投票:0回答:2

我有一个控制器的构造函数,我想在其中实例化一个通过依赖注入访问存储库的对象。

像这样:

ContactController.cs:我收到错误,因为我没有传递IContactRepository

private ContactOperationsFacade contactOperator;

ContactController(){
    contactOperator = new ContactOperationsFacade(//I want to use DI here);
}

ContactOperationsFacade.cs:

private readonly IContactRepository contactRepository;

public ContactOperationsFacade(IContactRepository contactRepositor){
    this.contactRepository = contactRepository;
}

如何在控制器的构造函数中实例化此ContactOperationsFacade对象仍然使用DI作为存储库?

c# asp.net-core dependency-injection asp.net-core-mvc
2个回答
2
投票

在asp.net核心中,只要范围允许,您就可以进行DI链接。因此,如果A依赖于B而控制器需要A,则只需将A和B都添加到di容器(代码的ConfigureServices部分),容器就会计算出来。

在这里阅读更多https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1


1
投票

ContactController应该跟随The Explicit Dependencies Principle

方法和类应明确要求(通常通过方法参数或构造函数参数)所需的任何协作对象才能正常运行。

类也应该依赖于抽象而不是与结核相关联。

所以假设像

public class ContactOperationsFacade: IContactOperationsFacade { //<-Note interface/contract

    private readonly IContactRepository contactRepository;

    public ContactOperationsFacade(IContactRepository contactRepositor){
        this.contactRepository = contactRepository;
    }

    //...
}

控制器应该依赖于外观来自的抽象

public class ContactController: Controller {

    private readonly IContactOperationsFacade contactOperator;

    public ContactController(IContactOperationsFacade contactOperator){
        this.contactOperator = contactOperator;
    }

    //...

}

并假设所有接口和实现都在DI容器中注册。

services.AddScoped<IContactOperationsFacade, ContactOperationsFacade>();

一旦注册了所有依赖项,服务提供者应在激活控制器时解决它们。

© www.soinside.com 2019 - 2024. All rights reserved.