2011-03-25 5 views
2

나는 의존성 주입의 초보자입니다. 나는 결코 사용하지 못했고, 그것이 무엇에 관한 것인가에 대해서는 전혀 모른 적이 없다. 그러나이 주제에 대한 나의 마지막 공격 이후에, 나는 그것이 객체와 그것의 의존성을 분리시키는 방법이라는 것을 발견했다. 일단 객체의 구체적인 버전을 구체화 할 책임이 없다면 이제 컨테이너가 우리를 위해 그것을 할 것이고 준비된 객체를 우리 손에 전달할 것이므로DI에 관한 질문 및 몇 가지 문제를 해결하는 방법

이제 요점은 다음과 같습니다. "언제 사용해야합니까?", 항상 ??? 사실, 내가 초보자이고이 패턴을 사용하는 프로젝트를 보지 못했기 때문에 나는 그것을 내 도메인 객체에 어떻게 적용해야하는지 알 수 없다. 그것은 내 물건을 인스턴스화하지 않을 것입니다 컨테이너는 항상 나를 위해 그것을 할 것이지만, 다음의 몇 가지 의문이 온다 ...

1) 종속성의 일부가 UI에서 오는 oobjects는 어떻습니까? ;

public class User(String name, IValidator validator) 

내가 UI에서 사용자 이름을 가져올 수 있음을 말하므로 conatiner 어떻게 그것을 알고 아직도 나를 위해이 객체 delliver 것인가?

2) 내가 겪고있는 Theres 다른 상황; 의존성이 이미 인스턴스화 된 객체라면, 예를 들어 SINGLETON 객체를 말하십시오. 나는 (Spring.NET, 예를 들어 HTTP 요청 범위에 대해 이야기하는) 종속성 beign 주입의 삶의 범위에 관한 theres 설정을 보았다 ... 그러나,, 요청 및 기타 웹 관련 것들이 내 프레 젠 테이션 레이어에, 그래서 어떻게 디자인 규칙을 위반하지 않고 내 프리젠 테이션 레이어와 내 도메인 레이어를 연결할 수 있습니까? (내 도메인은 소비되는 위치, 레이어 의존성 등을 전혀 인식하지 못함)

여러분 모두에게 진심으로 이메일을 보내고 싶습니다. . 매우 감사합니다.

+1

많은 DI 질문 오늘 =)이 대답이 도움이되는지보십시오. : http : //stackoverflow.com/questions/5433211/difference-between-ninject-and-rhinomock-or-moq/5433231#5433231 – gideon

+0

그 유용한 @ giddy, 감사합니다. 정확하게 요점은 아닙니다! =) – renatoargh

+0

@Renato는 DI를 사용하는 이유를 설명하는 데 도움이 될 것이라고 생각했습니다. =) – gideon

답변

1

일반적으로 IoC를 실행하면 IoC에 모든 것을 등록하고 컨테이너에서 완전히 수화 된 물체를 뱉어내는 경향이 있습니다. 그러나, 당신은 몇 가지 유효한 포인트를 가져와.

아마도 "종속성"의 정의가 순서대로 있습니다. 넓은 의미에서, 의존성은 주어진 클래스가 클래스가 올바르게 작동하도록하기위한 구체적인 구현이 필요한 기능 (인터페이스)의 집합입니다. 따라서 대부분의 중요하지 않은 프로그램은 의존성으로 가득차 있습니다. 유지 관리의 용이성을 높이기 위해 일반적으로 모든 종속성의 느슨한 결합이 선호됩니다. 그러나 느슨하게 결합 된 경우에도 IOC 레지스트리를 오염시키지 않으려는 특수한 정보가 필요한 객체의 경우 종속성의 인스턴스화를 자동화 할 필요가 없습니다. 목표는 느슨하게 사용을 결합하는 것이지 반드시 생성하는 것은 아닙니다.

포인트 1과 관련하여 일부 IoC 프레임 워크는 외부 매개 변수가 주어지지 않아도됩니다. 그러나 대개 대리인을 팩토리 메서드로 등록 할 수 있습니다. 이 대리자는 UI와 같은 외부 정보가 주어진 Controller와 같은 객체에 속할 수 있습니다. 로그인은 완벽한 예입니다 : 객체를 생성하고, LoginController라고 말하고, IoC에 ILoginController로 등록하십시오. 로그인 페이지에서 해당 컨트롤러를 참조하고, 로그인 페이지가 인스턴스화 될 때 주입되며 로그인 페이지는 입력 된 자격 증명을 전달합니다. Controller는 인증을 수행하고 User 객체를 생성하는 GetAuthenticatedUser() 메서드를 갖습니다. 이 메소드를 IoC에 사용자 용 팩토리로 등록 할 수 있으며, 사용자가 필요할 때마다 팩토리 델리 게이트가 평가되거나 사용자를 실제로 필요로 할 때 호출 할 종속 메소드로 전달됩니다.

점 2에서, 객체의 단일 인스턴스를 설정하는 것은 IoC 패턴의 강도입니다. 인스턴스를 생성하기 위해 private 인스턴스 생성자, 정적 인스턴스 및 정적 생성자를 사용하여 진정한 싱글 톤을 만드는 대신 클래스를 IoC에 등록하고 인스턴스를 한 번만 인스턴스화하고 모든 요청에 ​​대해 해당 인스턴스를 사용하도록 지시하기 만하면됩니다. 힘은 유연성입니다. 나중에 인스턴스가 둘 이상이되도록하려면 등록을 변경하면됩니다. 디자인 패턴 규칙을 어느 쪽이든 깨뜨리지 않습니다. 해당 컨트롤러가 모든 페이지에 대해 동일한 지 또는 요청 당 새 인스턴스에 대해 동일한 지 여부에 관계없이 뷰에는 항상 컨트롤러가 주입됩니다.

1

1)이 생성자는 잘못된 곳/틀림에 유효성 검사기를 주입하고있을 가능성이 있습니다. IOC는 존재의

2) Neighter보기 모델과도 아니다 컨트롤러는 MVC 구성 요소가 실제로 인스턴스화 배경 아키텍처()는 아키텍처를 느낄 때

당신은 IOC의를 사용해야에 놓여 야, 알고 있어야한다 복잡해질 수 있고 많은 사람들이 먹어야한다. 엔터프라이즈 애플리케이션이나 플러그인으로 확장한다고 생각되는 UI를 작성하는 경우 커맨드 라인 유틸리티를 작성하는 경우 플러그인이 필요할 수도 있습니다. 다음과 같은 혜택을 원할 때마다 당신은 의존성 주입을 사용한다

1

:

  • 쉽게
  • 응용 프로그램의 일부, 또는 다른 응용
  • 사이에 모듈을 재사용 할 수있는 기능을 모듈을 대체 할 수있는 능력 병렬 개발을 원할 때 시스템의 구성 요소가 추상화에 의존하기 때문에 분리되고 병렬로 개발 될 수 있습니다.
  • 느슨한 결합으로 인해 시스템을 더 쉽게 유지하려는 경우
  • 테스트 가능성 (모듈 교체의 전문화)을 원할 때.이것은 당신의 다른 질문에 대답하기 위해

을 DI을 사용하는 가장 큰 이유 중 하나입니다 :

1) 특정 생성자 매개 변수가 지정 될 수 있도록 다른 사람이 컨테이너에 의해 해결하는 동안 당신은 많은 IOC의 컨테이너를 구성 할 수 있습니다 . 그러나 유효성 검사기 종속성을 취하는 UserFactory이 더 적합 할 수 있으므로 코드 조각을 리팩토링하는 방법을 고려해야하며 사용자 이름을 사용하고 새 사용자를 반환하는 NewUser 메서드가 있습니다 (직접 인스턴스화하거나 컨테이너).

2) 빌드 한 각 응용 프로그램에는 컨테이너가 구성되고 루트 개체가 해석되는 구성 루트가 있습니다. 따라서 각 응용 프로그램에는 고유 한 IoC 구성이 있으므로 응용 프로그램 유형과 구성 설정간에 예상되는 링크가 있습니다. 일반적인 추상화 등록은 모든 응용 프로그램간에 공유 할 수있는 구성 코드에 배치 할 수 있습니다.

관련 문제