2017-03-28 1 views
5

asp.net 핵심 응용 프로그램이 있습니다. 응용 프로그램에는 몇 가지 작업을 수행하는 몇 가지 도우미 클래스가 있습니다. 각 클래스에는 다른 서명 방법이 있습니다. 나는 각 클래스에 대한 인터페이스를 생성 한 다음 DI 프레임 워크로 유형을 등록하는 .net 핵심 예제를 온라인에서 많이 볼 수 있습니다. 예를 들어,DI 용 인터페이스가 필요합니까?

기본적으로 각 인터페이스에는 하나의 클래스 만 있습니다. 그럼 난

services.AddScoped<IStorage, Storage>(); 
services.AddScoped<IOcr,Ocr>(); 

으로 DI 이러한 유형을 등록하지만 난 여기에 인터페이스는 중복 볼 수 있도록 인터페이스를하지 않고 유형을 등록 할 수 있습니다. 예 :

services.AddScoped<Storage>(); 
services.AddScoped<Ocr>(); 

정말 인터페이스가 필요합니까?

+1

잘 기술적으로 당신이 그들을 필요가 없습니다, 그러나 당신은 어떻게 적절한 테스트를 할 것 : 그래서처럼 등록

public class Storage { public virtual Task Download(string file) { } } public class DiskStorage: Storage { public override Task Download(string file) { } } 

과 : 그래서 예를 들면? 여기 http : //softwareengineering.stackexchange를보십시오.co.kr/questions/298831/in-interface-in-dependency-injection – DavidG

+0

Rhino 모의 같은 모의 프레임 워크가 인터페이스가없는 모의 객체를 만들지 않습니까? – LP13

+0

이 질문은 아마도 http://softwareengineering.stackexchange.com에 더 적합 할 것입니다. 중재자에게 당신을 위해이 질문을 옮기라고 요청하십시오. (다시 게시하지 마십시오 - 남용으로 간주됩니다.) –

답변

8

아니요, 은 종속성 주입을위한 인터페이스가 필요합니다. 그러나 그들을 사용해야합니다!

지적했듯이 구체적인 유형을 서비스 컬렉션에 등록 할 수 있으며 ASP.NET Core가이를 클래스에 정확하게 주입합니다. new Storage()으로 인스턴스를 생성하는 것만으로 얻을 수있는 유일한 이점은 service lifetime management (일시적 vs. 범위 비교)입니다.

그것은 DI를 사용하는 힘의 일부일뿐입니다. @DavidG가 지적했듯이, 인터페이스가 종종 DI와 쌍을 이루는 큰 이유는 테스트 때문입니다. 클래스를 다른 구체적인 클래스 대신 인터페이스 (추상화)에 의존하게하면 훨씬 쉽게 테스트 할 수 있습니다.

테스트를 위해 IStorage을 구현하는 MockStorage을 만들면 소비자 클래스가 그 차이를 알 수 없어야합니다. 또는 조롱 프레임 워크를 사용하여 조롱 된 IStorage을 쉽게 만들 수 있습니다. 조롱 프레임 워크는 구체적인 클래스 위조를 지원하지 않거나 매우 어색합니다. 인터페이스는 훨씬 간단하고 깨끗합니다.

8

작동합니까? 예. 당신이 그것을해야합니까? 제

의존성 삽입 (Dependency Injection)는 종속성 반전의 원칙을위한 도구입니다. "추상화에 의존, [하지] concretions"

하나가되어야 https://en.wikipedia.org/wiki/Dependency_inversion_principle

아니면이 SOLID에 설명 된 것 같은

콘크리트의 모든 부분을 그냥 주입하면 작동 할 수 있습니다. 그러나 DI가 달성하기 위해 설계된 것이 아닙니다. 이자형.

0

다른 사람들이 이미 언급 한 내용을 다루지는 않겠지 만 DI가있는 인터페이스를 사용하는 것이 가장 좋은 방법입니다. 그러나 객체 상속을 사용하면 다른 유용한 옵션을 제공 할 수 있다는 점을 언급 할 가치가 있습니다.

services.AddScoped<Storage, DiskStorage>(); 
관련 문제