Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 构造函数上带有参数的.net核心依赖项注入_Dependency Injection_Asp.net Core - Fatal编程技术网

Dependency injection 构造函数上带有参数的.net核心依赖项注入

Dependency injection 构造函数上带有参数的.net核心依赖项注入,dependency-injection,asp.net-core,Dependency Injection,Asp.net Core,在.NETCore中,如果我使用依赖注入,所有构造函数参数都必须由DI提供,这是真的吗 比如说: 公众人物CreateClient() { 字符串phone=“12345678”; 返回新的联系人(电话号码:phone); } 公共阶层人士 { 私人只读服务(U服务);; 私有只读字符串_phoneNumber; 公众人士(服务、字符串电话号码) { _服务=服务; _phoneNumber=电话号码; } 公共字符串PhoneNumber{get{return\u PhoneNumber;}}

在.NETCore中,如果我使用依赖注入,所有构造函数参数都必须由DI提供,这是真的吗

比如说:

公众人物CreateClient()
{
字符串phone=“12345678”;
返回新的联系人(电话号码:phone);
}
公共阶层人士
{
私人只读服务(U服务);;
私有只读字符串_phoneNumber;
公众人士(服务、字符串电话号码)
{
_服务=服务;
_phoneNumber=电话号码;
}
公共字符串PhoneNumber{get{return\u PhoneNumber;}}
公共字符串性别{get{return{U service.GetGenderFromDb();}}
}
公共接口服务
{
字符串GetGenderFromDb();
}
公共类FooService:ISomeService
{
公共字符串GetGenderFromDb(){return“Male”;}
}

这是否可能使DI和客户端提供的值保持在同一个构造函数中?

任何调用“new”来创建对象的地方都不适合自上而下进行构造函数DI。当您想要将参数传入构造函数时,DI不适合

正如其他人所提到的,最好的办法是建立一个工厂。它可能看起来像这样

公共类人物
{   
私人只读服务(U服务);;
私有只读字符串_phoneNumber;
公众人士(服务、字符串电话号码)
{
_服务=服务;
_phoneNumber=电话号码;
}
公共字符串PhoneNumber{get{return\u PhoneNumber;}}
公共字符串性别{get{return{U service.GetGenderFromDb();}}
}
公共类PersonFactory:IPersonFactory
{
私有只读服务_someService;
公共人员工厂(公共服务)
{
_someService=someService;
}
公共GetPerson(字符串电话号码)
{
返回新的人员(_someService,phoneNumber);
}
}
现在,当您想要创建一个person时,您可以插入
IPersonFactory
的一个实例,并在其上调用
GetPerson

此外,你可能会发现,你希望你的模型更简单,工厂做大部分的繁重工作。我看到目前数据库中的性别信息,因此您可以将其更改为更像以下内容:

公共类人物
{   
公众人物(字符串性别、字符串电话号码)
{
性别=性别;
PhoneNumber=电话号码;
}
公共字符串PhoneNumber{get;private set;}
公共字符串{get;private set;}
}
公共类PersonFactory:IPersonFactory
{
私有只读服务_someService;
公共人员工厂(公共服务)
{
_someService=someService;
}
公共GetPerson(字符串电话号码)
{
var gender=_someService.GetGenderFromDb();
返回新的人员(性别、电话号码);
}
}

现在,Person类没有任何关于性别来源的详细信息,工厂每次都会解决如何创建Person模型的问题

在我的例子中,我有一个复杂的类,包含用例所需的几个构造函数

在转换为核心依赖项注入的过程中,我简单地创建了一个基类,其中有一个构造函数处理DBcontexts和Helper服务的注入,然后在原始类中继承了这个基类



如果您只有一个构造函数,则会出现问题。

如何在启动时注册这些服务?@Ahmar只是普通的注册服务。AddTransient();Ok DI只解析那些注册到它的依赖项。其他参数未解析。ya,但是否仍有实现此目的的方法?我需要注册的依赖项和客户端提供的值,如问题所示。Google或搜索Stackoverflow以查找“抽象工厂”,必须离开工作,在Quick上找不到参考。这个答案与我从@Tseng建议中得到的想法后的实现相同。谢谢你发布这个答案