2010-07-29 5 views
1

개체에 개체를 주입해야하는지, 개체를 내부적으로 만들어야 하는지를 이해하려고합니다.DI 원칙에 따라 C'tor 매개 변수로 주입해야하는 것은 무엇입니까?

  1. 나는 실행 시간 동안 수집 된 정보를 보유하는 List<int> (데이터 필드로)이있는 경우. 그것을 삽입하는 대신 c'tor에서 초기화해야합니다.

하지만 COM 포트를 통해 통신하는 하드웨어 클래스는 무엇입니까?

HW 클래스를 SerialPort로 초기화 시키거나 주입합니까?

  1. 위에서 언급 한 SerialPort를 삽입해야하는 경우; 가장 좋은 방법은 무엇입니까?

내가 수동으로 생성 할 :

SerialPort port = new SerialPort(name, baud ...); 

HWClass hwClass = container.Reolve<IHWClass>("HWClass", new InjectionConstructor(port)); 

또는 유니티 컨테이너

SerialPort port = conatiner.Resolve<SerialPort>(...); 

HWClass hwClass = container.Reolve<IHWClass>("HWClass", new InjectionConstructor(port)); 

또는 내가 HWClass C'tor 내부를 init을해야을 사용하고 계십니까? 당신은

아디 엘

답변

4

Domain-Driven Design서비스 다른 도메인 오브젝트 (엔티티 및 값 개체)를 구별. 달리 DDD에 가입하지 않아도이 구분은 매우 유용합니다.

서비스 서비스는 일반적으로 소비자를 위해 작업을 수행하는 수명이 긴 상태없는 개체입니다. 그들은일반적인 종속성을 사용하면 주입으로 많은 이점을 얻을 수 있습니다. 귀하의 경우에는

,하여 SerialPort와 IHwClass 모두가 외부 리소스를 많이 서비스와 같은 표현 소리 때문에, 그래서 확실히 생성자 삽입를 통해 그들에게를 주입한다.

그러나 추상화를 주입하는 경우에만 느슨한 결합의 이점을 얻습니다.IHWClass는 인터페이스이기 때문에 잘 보입니다. 그러나 SerialPort는 구체적인 클래스처럼 보이므로, 인젝션을 많이하지는 않습니다. SerialPort (예 : ISerialPort)에서 인터페이스를 추출하고이를 대신 주입하는 것이 좋습니다.

+0

예를 들어 SerialPort가 스트림처럼 상속되거나 스트림처럼 동작하는 경우 인터페이스 대신 Stream을 사용하십시오. – strager

+0

감사합니다. 사실 나는 꽤 구체적인 클래스입니다. NET FW의 System.IO.Ports.SerialPort를 참조했다. 그것이 주입 목적을위한 인터페이스로 포장하는 것은 꽤 인공적으로 보이지 않습니다. "인터페이스를 추출 할 수없는 경우 - 주사하지 마십시오!"라고 소리가납니다. 내가 잘못 ? Unity를 사용하여 SerialPort를 만들면 어떤 이점이 있습니까? 아니면이 경우 직접 만들 때와 동일합니까? –

+0

기존 API를 래핑하는 것은 아주 정상입니다. http://stackoverflow.com/questions/3264992/wrapping-an-api-to-support-dependency-injection 인터페이스가 이미 마련되어 있다면 분명 더 쉬워 질 것입니다.하지만 보잘것없는 일을하는 보람있는 일. –

2

내 일반적인 규칙은 객체가 가질 수있는 경우는 상태가 클래스 외부에서 변경된 점이다하거나 테스트 또는 동적으로 미래의 어떤 시점에서 하나의 대체 구현을 제공 할 수있게하려면 그것을 주입해야합니다. 클래스가 내부적으로 만 사용 및 수정되고 구현이 포함 된 클래스에만 의존하면 내부적으로 종속성을 만드는 것이 좋습니다. 귀하의 예를 사용하려면 SerialPort을 삽입하고 List<int>은 삽입하지 않을 것입니다.

TDD (Test Driven Development)를 수행 했으므로 나는 이러한 결정에 대해 너무 걱정하지 않는다는 것을 알았습니다. 테스트를 더 쉽게하기 위해 클래스를 분리하기 위해 어떤 클래스를 주입해야하는지 알고 있다는 사실을 꽤 빨리 알 수 있습니다. 처음에는 제대로 이해하지 못하더라도 몇 가지 테스트에서 코드가 자연스럽게 그 방향으로 진화하고 있음을 알 수 있습니다.

관련 문제