의존성 주입으로 구성을 어떻게 관리합니까?


18

저는 DI / IOC의 열렬한 팬입니다. 어려운 종속성을 처리 / 추출하는 데 유용하며 인생을 조금 더 쉽게 만듭니다.

그러나 나는 그것에 대해 작은 그립을 가지고 있는데, 어떻게 해결 해야할지 모르겠다.

DI / IOC의 기본 아이디어는 개체가 인스턴스화 될 때 모든 해당 종속성이 생성자 내에 미리 채워져 있다는 것입니다.

그러나 IMHO에는 생성자에 대한 여러 유형의 매개 변수가 있습니다 (특히 오브젝트를 변경할 수없는 경우).

  1. 종속성 (객체가 작동하는 데 필요한 객체)
  2. 구성 (작업을 수행하는 데 필요한 환경에 대한 정보)
  3. 매개 변수 (작업이 수행 된 데이터)

IOC가 종속성과 잘 작동한다는 것을 알았습니다. 그러나 나는 여전히 다른 두 가지를 다루는 가장 좋은 방법을 찾으려고 노력하고 있습니다. 그러나 생성자가 IOC 컨테이너에 의해 실행되도록 실행되었으므로 이러한 항목을 IOC 컨테이너에 배치해야합니다.

사람들이 사용하는 전략 / 패턴과 사람들이 발견 한 장단점을 알고 싶습니다.

NB. 나는 이것이 매우 주관적인 질문이라는 것을 알고 있으며 SE 지침에 따라 "좋은"주관적인 질문으로 만들려고 노력했습니다.


"구성"이란 개발 환경 구성 (예 : 개발 또는 프로덕션)을 의미합니까? 그렇다면 일반적으로 기존의 종속성으로 처리합니다.
MetaFight

종속성이 있지만 기본 구성으로 구성하는 것이 가장 좋으므로 객체가 올바르게 구성됩니다. 추가 메소드를 호출하여 구성 및 기타 매개 변수를 설정하십시오. ctor에서 너무 많은 일을하는 것은 나쁜 일입니다.
david.pfx

I am still trying to work out the best way to deal with the other two-일반 매개 변수로 객체에 전달합니까?
Robert Harvey

@RobertHarvey 불변의 객체? 디버깅이 훨씬 쉬워집니다.
ArTs

답변:


9

구성 (작업을 수행하는 데 필요한 환경에 대한 정보)

환경에 대한 정보를 제공하기위한 구성 클래스 (선택하기 쉬운 인터페이스 + 구현)를 작성하십시오. 이렇게하면 개체가 작동하는 데 필요한 다른 개체와 구성이 다르지 않습니다 (1 지점).

매개 변수 (작업이 수행 된 데이터)

객체 지향 환경에서 기본 데이터 유형은 객체로 캡슐화 될 수 있으므로 포인트 1로 이어질 수 있습니다. 그러나이 SO 질문은 흥미로울 것입니다 .DI 를 사용할 때 생성자의 기본 매개 변수 상황을 정확하게 처리합니다. 컨테이너. 주어진 예에서, 설계는 개선 될 수 있으며, 이는 생성자에서 원시 유형의 필요성을 완전히 피할 수있다.


1

내가하는 것은이 경우의 공장 패턴입니다.

객체 자체를 종속성으로 사용하지 않지만 컨테이너에 의해 자동으로 바인딩 할 수없는 매개 변수를 허용하는 Get 메서드를 사용하여 팩토리 객체를 만듭니다.

전의.:

 interface IDependencyObject {
       ....
 }

 class DependencyObject {

      public DependencyObject(int primitive, IAnotherDependency anotherDependency) {
      ...
      }

 }

 class DependencyObjectFactory {

      private readonly IAnotherDependency anotherDependency;

      public DependencyObjectFactory(IAnotherDependency anotherDependency) {
           this.anotherDependency = anotherDependency;
      }

      public IDependencyObject Get(int primitive) {
           return new DependencyObject(primitive, anotherDependency);
      }
 }

 interface IDependencyObjectFactory {
       IDependencyObject Get(int primitive);
 }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.