2009-11-06 5 views
10

IOC 컨테이너를 처음 사용하고 있으며 NInject를 시작하고 있습니다.다른 비 의존성 생성자 인수를 사용한 생성자 삽입

당신이 당신의 생성자는 서비스하지 않습니다와 IOC 컨테이너에 의해 인스턴스화 할 필요가없는 매개 변수가하려는 경우 어떻게해야합니까? 예를 들어

:

public class Person 
{ 
    private readonly string _name; 
    private readonly IPersonRepository _repository; 

    public Person(string name, IPersonRepository repository) 
    { 
     _name = name; 
     _repository = repository; 
    } 

    ...... 
} 

이 사람은 항상 이름이 있는지 확인하기 위해, 이름는 Person 클래스의 요구 사항입니다 상상 해보세요, 그래서 우리는이 생성자에 전달되어야합니다.

NInject를 사용하는 사람의 인스턴스를 어떻게 얻을 수 있습니까? IOC 컨테이너가 IPersonRepository를 통과해야하는 반면, 새로운 Person을 생성하는 앱의 어느 쪽인지에 의해 이름이 전달되어야합니다. 우리는 프로그래밍 언어의 의미 론적 힘의 일부를 잃어 가고있다 -

나는 이름 또는 저장소 중 하나가 대신 속성을 사용하여 주입 될 수 있지만,이 깨끗한 솔루션을하지 않을 것이라는 점을 이해합니다.

답변

5

클래스는, 위의 작성 등의 IOC 컨테이너와 함께 사용하기위한 좋은 후보가 될하지 않을 것입니다. 당신은 어떤 주 (이름)를 가지고있는 Person 엔티티와 (어떤 저장소가 사용되던간에) 어떤 동작을 수행하면서 여기에 관심을 기울이고 있습니다. Person 엔티티가 생성자를 통해 IPersonRepository의 구현을 취하는 클래스를 통해 검색되거나 생성되도록 코드를 리팩터링하면 의존성 삽입이 더 좋은 위치에있게됩니다.

+0

OK는 의미가 있습니다 - 코드에서 어떻게 작동하는지 알 수 있습니다. – cbp

2

나는 정중 위 케빈 맥마흔의 반응에 동의하고, 그 이유는 난 단지 다른 IoC 컨테이너와 ... 당신이 원하는 것을 정확히 수행 의존성 주입 코드를 보았다는 것이다. 즉, 다른 Ioc 컨테이너 인 Castle Windsor였습니다. 설정 파일에서 name에 제공 할 값을 말하도록 섹션을 만들 수 있습니다 (이름에 대해서는 그렇게하는 것이 좋지 않지만 "connectionString"과 같은 속성 인 경우 많은 것을 만들 수 있습니다). 감각).

그래서 ... 당신이하려고하는 것은 일반적으로 의존성 주입에 적합하지 않다는 것입니다 ... 단지 Ninject가 그것에 익숙하지 않은 것입니다 (또는 Ninject가 그것을 수용 할 수도 있습니다). .. 나는 그것의 덜 사용되는 모든 기능을 충분히 잘 알지 못한다.) 나는이 질문을하기 때문에

+1

실제로 NInject가이 작업을 수행 할 수 있다고 생각합니다. 예 : http://stackoverflow.com/questions/1374098/with-parameters-constructorargument-with-ninject -2-0하지만 매개 변수 이름을 문자열로 전달해야합니다. Intellisense에서 생성자 인수를 볼 수 없습니다. 긴 메소드 이름 ('WithConstructorArguments') ... 나에게 휴식을 가져라! – cbp

8

그것은 년 이상되어, 나는 더 지금은 그때보다 알고있다. 케빈의 대답은 정확하고 모범 사례입니다.하지만 때로는 레거시 수업을 사용해야하고 제 질문에있는 것과 같은 것을하고 싶습니다. 여기에 내가 Ninject에 함께 할 방법은 다음과 같습니다

public class Person 
{ 
    [Inject] 
    public IPersonRepository PersonRepository { get; set; } 

    private string _name; 

    public Person(string name) 
    { 
     _name = name; 
     StaticKernelContainer.Inject(this); 
    } 
} 

StaticKernelContainer의 구현은 Ninject에 웹 확장 프로젝트에서 찾을 수 있습니다.

+1

+1에 대한 후속 조치 – ChrisWue

+0

관련 질문 및 답변 : http://stackoverflow.com/questions/12136926/dependency-injection-with-constructor-parameters-that-arent-interfaces#comment16245407_12136926 –