2017-01-16 2 views
7

.net 코어에서 종속성 삽입을 사용하는 경우 모든 생성자 매개 변수가 DI에 의해 제공되어야한다는 것은 사실입니까?. 생성자에 매개 변수가있는 코어 종속성 주입

는의가 있다고 가정 해 봅시다 : 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"; } 
} 

이 가능합니까?

+0

시작시 이러한 서비스를 등록하는 방법은 무엇입니까? – Ahmar

+0

@Ahmar 정상적인 등록 services.AddTransient (); –

+0

Ok DI는 해당 레지스터에 등록 된 종속성 만 해결합니다. 다른 매개 변수가 해결되지 않았습니다. – Ahmar

답변

7

개체를 만들기 위해 "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); 
    } 
} 

지금, 대신 당신은 IPersonFactory의 인스턴스에 주입하고, 그 위에 GetPerson을 부를 것이다.

또한 모델을 더 평이하게 유지하고 대부분의 무거운 작업을 수행 할 수 있습니다. 나는 성별이 순간에 데이터베이스에서 오는 볼, 그래서 당신은 더 다음과 같이 그것을 변경할 수 있습니다 :

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 클래스는 그것이 성별에서 얻을 수있는 위치에 대한 모든 세부 사항이없는, Factory는 매번 Person 모델을 생성하는 방법을 연구한다.

+0

에서 잘 작동합니다.이 답변은 @Tseng 제안에서 아이디어를 얻은 후 제 구현과 동일합니다. 이 답변을 게시 해 주셔서 감사합니다. –