9

내 종속성 주입 컨테이너를 저장/참조해야하는 이유가 궁금합니다. 컨테이너를 정적 클래스에 정적 속성으로 유지하는 것이 좋습니까? 아니면 컨테이너를 애플리케이션의 인스턴스 변수로 가져야합니까? 각 옵션의 장점과 단점이 무엇인지 궁금하네요. 웹, mvc, 콘솔 및 Windows 응용 프로그램에서 가장 좋은 방법은 무엇입니까?DI 컨테이너에 대한 참조는 어디에 저장해야합니까?

+0

중복 : http://stackoverflow.com/questions/644747/autofac-in-web-applications-where-should-i-store-the-container-for-easy-access http://stackoverflow.com/ 질문/277438/추상 - ioc- 컨테이너 - 배후 - 싱글 톤 - 그것 - 잘못 - http://stackoverflow.com/questions/480286/best-practices-for-ioc-container http://stackoverflow.com/ 질문/367178/ioc-containers-specific-windsor http://stackoverflow.com/questions/1612682/typical-ioc-container-usage-passing-data-down-the-line –

+1

모두에게 감사드립니다! 모든 복제본에 대해 유감스럽게 생각합니다. 이것은 dup이라고 생각했지만 질문을 찾기 위해 문구를 사용하는 방법을 잘 모르겠습니다. –

답변

5

응용 프로그램에 인스턴스 변수로 저장하는 것이 좋습니다. 전역 적으로 액세스 할 수있는 싱글 톤으로 만드는 정적 속성을 사용하면 응용 프로그램의 종속성을 숨 깁니다. 이는 의존성 주입 컨테이너를 사용하여 멀리 떨어져 나가려하는 것 중 하나입니다!

그렇다면 프레임 워크로 인해 응용 프로그램 인스턴스에 액세스하는 것이 어려워지면 정적 변수를 사용하는 것이 세계 끝이 아닐 수도 있습니다.

1

나는 Sternal 씨에게이 사실에 동의합니다. 한 가지 고려해야 할 것은 DI 컨테이너가 IDisposable을 구현하기 때문에 정상적인 프로그램 종료시 컨테이너를 폐기하고자하는 것입니다. How do you reconcile IDisposable and IoC?

또한 응용 프로그램 전체에서 DI 컨테이너에 의존성이 분산되는 것을 피하는 것이 가장 좋습니다. 즉, 컨테이너를 전역 적으로 사용할 수 있도록 (싱글 톤, 정적 속성 또는 주입 된) 컨테이너를 Service Locator으로 사용하지 않도록하십시오.

대신 종속성의 종속성을 해결하는 컨테이너 기능을 사용할 수 있습니다. 예를 들어 응용 프로그램 시작시 컨테이너를 만들고이 컨테이너를 사용하여 MVC에서 모델을 구성 할 수 있습니다. 모델은 저장소 및 웹 서비스에 의존 할 수 있습니다. 저장소는 로거에 의존 할 수 있습니다. 모델이 구축 될 때 컨테이너가이 모든 것을 해결합니다. 모델이 종속성 인스턴스를 즉석에서 작성해야하는 경우, 팩토리를 팩토리에 삽입하십시오.

+1

동의하고, 한 포스터가 Mauricio가 파헤친 속임수 중 하나에 그것을 어떻게 넣었는지를 좋아합니다. "IOC 컨테이너를 프로세스의 최상위 레벨/진입 점에 놓고 그 아래에있는 모든 것에 종속성을 주입하는 데 IOC 컨테이너를 사용합니다." (http://stackoverflow.com/questions/480286/best-practices-for-ioc-container) –

+0

@Jeff - 멋진 견적; 간단하고 요점. Thorsten Lorenz가 Mauricio의이 링크에도 훌륭한 답을 얻었습니다. http://stackoverflow.com/questions/480286/best-practices-for-ioc-container – TrueWill

+0

컨테이너를 최상위 수준에 놓으면, 이것은 아마 주사 (데이터 액세스 아마도)를 요구하는 가장 낮은 수준의 어셈블리에 대한 참조를 보유 할 필요성을 창출합니다. 이것은 나를 조금 괴롭힌다 :( – dougajmcdonald

관련 문제