我有一个控制器的构造函数,我想在其中实例化一个通过依赖注入访问存储库的对象。
像这样:
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作为存储库?
在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
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>();
一旦注册了所有依赖项,服务提供者应在激活控制器时解决它们。