의존성 주입 프레임 워크는 의존성 위험을 야기합니까?


13

의존성 주입을 사용하기 위해 기존 시스템을 리팩토링했으며 그 작업이 순조롭게 진행되었습니다.

얼마 후 많은 사내 라이브러리가 내가 사용한 DI 프레임 워크에 의존한다는 것을 알았습니다. 결과적으로 전체 프로젝트는 이제이 타사 프레임 워크에 의존합니다.

나는 모든 의존성을 공유 라이브러리에 의존 시켜서 모든 의존성을 분리하는 데 아이러니를 보았습니다.

첫 번째 반응은 종속성 프레임 워크를 중심으로 래퍼 라이브러리를 만드는 것이 었습니다. 따라서 필요한 경우이 프레임 워크를 교체 할 수 있습니다. 관련된 작업을 추정 한 후 결과 API가 기존 프레임 워크와 유사하므로 교체가 더 어려워 짐을 깨달았습니다. 그래서 나는 그 생각을 버렸다.

내 관심사는 내가 사용하는 DI 프레임 워크가 더 이상 사용되지 않거나 교체해야한다는 것입니다.

DI로 작업 할 때 프로젝트와 DI 프레임 워크 간의 연결을 줄이는 개발 패턴이 있습니까?


4
"DI 프레임 워크를 사용하지 마십시오"패턴. 당신이 실제로 가지고 있지 않은 문제를 해결하고 있는지 궁금합니다. DI 프레임 워크를 얼마나 바꿀 수 있습니까?
Oded

1
@ 좋은 DI 프레임 워크는 코드와 투명하게 작동 할 수 있어야하지만 불가능한 경우가 있습니다. 그런 다음 클래스 내에서 DI API를 사용해야합니다. 이러한 경우 클래스를 변경할 필요없이 DI 프레임 워크를 공유하거나 변경하기가 어렵습니다. 이 DI 프레임 워크를 사용한 것은 이번이 처음입니다. 교체해야하는지 잘 모르겠습니다.
Reactgular

8
시스템은 또한 전기에 의존합니다. 먼저 분리를 제안합니다.
Idan Arye 2018 년

3
@MathewFoscarini 이것은 안티 패턴이 아닙니까? 당신은 그것을 할 수 있지만 의존성을 난독 화해서는 안됩니다.
maaartinus

2
@MathewFoscarini DIFramework.Get<IService>()는 실제로 의존성 주입이 아닙니다. Service Locator라는 관련 패턴입니다. 많은 사람들이 Service Locator를 프레임 워크에 연결하고 너무 쉽게 남용하기 때문에 (Singleton처럼) Service Locator를 싫어합니다. : 마틴 파울러는이 패턴에 대한 훌륭한 기사가 martinfowler.com/articles/injection.html
벤자민 호지 슨

답변:


8

DI 프레임 워크를 사용하면 코드가 해당 항목에 종속되도록 만들 수 있습니다. 실제로 이것은 다른 모든 프레임 워크 또는 기초 라이브러리, 특히 해당 lib가 코드의 어느 곳에서나 사용되는 일부 일반적인 기능으로 프로젝트를 지원할 때 모든 사실에 적용되기 때문에 너무 놀랍습니다. 예를 들어, 특정 UI 프레임 워크 또는 웹 프레임 워크를 사용하기로 결정한 경우 해당 라이브러리를 기반으로 특정 양의 코드를 빌드하자마자이 결정을 변경하기가 어렵습니다. 특정 (비표준) String클래스 를 사용하기로 결정한 경우 나중에 해당 결정을 쉽게 변경할 수 없습니다. 이러한 결정은 구조적인 결정으로, 특정 프로그래밍 언어를 선택하는 것과 같으며 100K 줄 이상의 코드를 작성한 후에 해당 결정을 변경하려고합니다.

모든 코드가 특정 프레임 워크에 의존하는 것은 예상 한대로하고 올바르게 유지 관리하는 한 문제가되지 않을 수 있습니다. 그러나 그렇지 않은 경우 문제가 될 수 있습니다. 이러한 상황을 처리하는 방법에는 몇 가지 전략이 있습니다.

  • 몇 년 동안 업데이트 및 새 릴리스를 제공 할 수 있다고 생각하는 공급 업체의 프레임 워크를 선택하십시오.

  • 충분한 코드 라인 (및 적절한 라이센스)을 가진 오픈 소스 프레임 워크를 선택하십시오. 따라서 공급 업체가 시장에서 사라지면 자체적으로 유지 관리를 수행 할 수 있습니다

  • 자신의 프레임 워크를 작성하십시오

  • 공급 업체가 제공되는 한 상황에 따라 생활하고 실제로 사라지면 다른 프레임 워크를 선택하고 새로운 프레임 워크를 사용하여 기존 프레임 워크를 에뮬레이트하는 어댑터를 작성하십시오.

래퍼 라이브러리를 미리 만드는 아이디어는 전혀 새로운 것이 아니지만, 실제로 작동하는지 여부는 알지 못합니다. 미래에 어떤 상황이 발생할지 알 수없는 미래 상황에 대해 가정해야 할 것입니다. "새로운"프레임 워크는 다음과 같습니다. 반면에, 몇 년 전에 위에서 언급 한 어댑터 전략을 적용하여 ~ 120K 줄의 코드로 C ++ 프로젝트에서 완전한 UI 프레임 워크를 성공적으로 교환했습니다.


19

일반적인 생성자 주입에는 프레임 워크가 전혀 필요하지 않습니다. 잃어버린 유일한 것은 구성 파일에서 종속성을 중앙 집중화하는 기능입니다.

DI 컨테이너는 개체 그래프가 매우 크고 복잡 할 때 사용되는 "엔터프라이즈 소프트웨어"패턴입니다. 응용 프로그램의 95 %가 필요하지 않은 것 같습니다.


5
소규모 프로젝트에는 필요 하지 않지만 프로젝트의 95 + % 이상이 이익 을 얻을 수 있다는 데 동의 합니다.
maaartinus

11
@maaartinus : 최소한의 이점을 위해 불필요한 추가 복잡성.
Robert Harvey

1
무엇입니까? 이것들은 클래스 당 통계입니다 : 0.5 주석, 0.1 구성 라인. 무슨 복잡성을 의미합니까 ???
maaartinus

2
@RobertHarvey : 위의 내용에 100 % 동의하지만 OP는 이미 DI 프레임 워크를 도입했다고 말합니다. "더 낫지 않는다"고 말하는 것은 실제로 그의 질문에 대한 답이 아닙니다.
Doc Brown

1
@maaartinus는 프레임 워크가 자동화 될수록 더 복잡한 것을 주입 할 수 있는 더 많은 것들을 제공 합니다. XML 설정 파일, 생성자 주입, 속성 주입, 자동 객체 조롱, 지연 주입 등이 있습니다. 이러한 DI 프레임 워크는 매우 복잡 할 수 있습니다.
Reactgular

0

DI 프레임 워크가 곧 곧 폐기 될 수 있다고 생각하지 않습니다. 쓸모 없게하려면 어떻게해야합니까?

  • 새롭고 똑똑한 패턴의 발명품일까요? 그러나 코드에서 훨씬 더 큰 변화가 필요할 것입니다.
  • 언어가 바뀌었을까요? 더 나쁘다.

나는 현재의 DI가 충분히 성숙했으며 거기에서 많은 일이 일어나고 있다는 것을 알지 못한다고 말하고 싶습니다. 언어를 지정하지 않았으므로 Guice에 대해 말하면 눈에 거슬리지 않으며 표준 Java 주석과 함께 작동합니다 (표준화되지 않은 것에 대해서는 자체적으로 사용하지만 거의 필요하지 않습니다). 오픈 소스이며 널리 사용되며 Apache 라이센스가 있습니다. 무엇이 문제 일 수 있습니까?

DI 프레임 워크를 변경하는 것이 다른 라이브러리를 변경하는 것보다 훨씬 쉬울 것이라고 확신합니다 (예 : UI 변경은 훨씬 더 많은 작업을 의미 함).

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