gpt4 book ai didi

dependency-injection - .net核心依赖注入(inject)在构造函数上带有参数

转载 作者:行者123 更新时间:2023-12-03 21:36:21 28 4
gpt4 key购买 nike

在 .net 核心中,如果我使用依赖注入(inject),是否所有构造函数参数都必须由 DI 提供?

比方说:

public Person CreateClient()
{
string phone = "12345678";
return new Person(phoneNumber: phone);
}

public class Person
{
private readonly ISomeService _service;
private readonly string _phoneNumber;
public Person (ISomeService service, string phoneNumber)
{
_service = service;
_phoneNumber = phoneNumber;
}

public string PhoneNumber {get { return _phoneNumber; } }
public string Gender {get { return _service.GetGenderFromDb(); } }
}

public interface ISomeService
{
String GetGenderFromDb();
}

public class FooService : ISomeService
{
public String GetGenderFromDb() { return "Male"; }
}

客户端提供的 DI 和值是否可以保留在同一个构造函数中?

最佳答案

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

正如其他人所暗示的那样,最好的方法是创建工厂。它可能看起来像这样。

public class Person 
{
private readonly ISomeService _service;
private readonly string _phoneNumber;
public Person (ISomeService service, string phoneNumber)
{
_service = service;
_phoneNumber = phoneNumber;
}

public string PhoneNumber {get { return _phoneNumber; } }
public string Gender {get { return _service.GetGenderFromDb(); } }
}

public class PersonFactory : IPersonFactory
{
private readonly ISomeService _someService;

public PersonFactory(ISomeService someService)
{
_someService = someService;
}

public GetPerson(string phoneNumber)
{
return new Person(_someService, phoneNumber);
}
}

现在当你想创建一个人时,你可以注入(inject) IPersonFactory 的实例。 , 并调用 GetPerson在上面。

此外,您可能会发现您希望您的模型更简单,而工厂可以完成大部分繁重的工作。我看到 Gender 目前来自数据库,因此您可以将其更改为更像以下内容:

public class Person 
{
public Person (string gender, string phoneNumber)
{
Gender = gender;
PhoneNumber = phoneNumber;
}

public string PhoneNumber {get; private set; }
public string Gender {get; private set;}
}

public class PersonFactory : IPersonFactory
{
private readonly ISomeService _someService;

public PersonFactory(ISomeService someService)
{
_someService = someService;
}

public GetPerson(string phoneNumber)
{
var gender = _someService.GetGenderFromDb();
return new Person(gender, phoneNumber);
}
}

现在,您的 Person 类没有任何关于它从何处获取 Gender 的详细信息,并且工厂每次都计算出如何创建 Person 模型。

关于dependency-injection - .net核心依赖注入(inject)在构造函数上带有参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41669433/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com