2012-03-02 5 views
2

DI 및 IoC에 점점 더 많은 관심을 가지려고합니다. 지금은 MVC 애플리케이션의 컨트롤러를 사용하여 DI의 개념과 구현을 이해합니다. 하지만 계층화 된 응용 프로그램이 있다고 가정합니다. 컨트롤러는 businesslogic 클래스를 호출하고 businesslogic clases는 저장소 클래스를 호출합니다.asp.net mvc에서 두 레이어의 의존성 주입

DI를 사용하여 리포지토리 파트의 비즈니스 로직을 두 번째 계층으로 설정하는 방법은 무엇입니까? 이렇게하면 응용 프로그램의 여러 수준에서 테스트 할 수 있습니다. 내가 싫어하는 것은 의존 관계를 컨트롤러에서 저장소로 전달하는 것입니다.

누군가가이 문제에 대한 힌트를 줄 수 있기를 바랍니다.

패트릭

답변

7

Ninject을 사용하여 구현하는 방법에 대한 최소한의 예. 이것은 DI/IoC에 대한 절대적인 진실이 아니며 단지 일 수있는 간단한 예제 일 수 있습니다. 지금까지 IMyRepository 다음 사용하는 경우

구성

// repositories 
base.Bind<IMyRepository>().To<MyRepository>(); 

// services 
base.Bind<IMyServices>().To<MyServices>(); 

은 구체적인 구현 MyRepository을 사용합니다.

컨트롤러

public class MyController : Controller 
{ 
    private readonly IMyServices _myServices; 

    public AnimalController(IMyServices myServices) 
    { 
     _myServices = myServices; 
    } 

    // your actions 
} 

다시 유사한 패턴 (생성자 주입)

서비스

public class MyServices : IMyServices 
{ 
    private readonly IMyRepository _myRepository; 

    public MyServices(IMyRepository myRepository) 
    { 
     _myRepository = myRepository; 
    } 

    public void Example() 
    { 
     _myRepository.PleaseDoSomething(); 
    } 
} 

는 또한 다른 것들을 많이 있다는 것을 기억하고있다 MyService 내부 IoC를 사용할 수있는 ASP.NET MVC에서 :

  • 제이션
  • 인증
  • 모델 메타 제공
  • 정의 모델 바인더
  • 제어기 공장 (예 국소 에러 메시지) 등
  • 예제 코드에서

업데이트

버그가 있었다. 의존성 주입은 서비스에서 수행되지 않았습니다. 이제는 정확해야합니다.

업데이트 2

나는 매우 귀하의 응용 프로그램을 부트 스트랩 NuGet 패키지를 사용하는 것이 좋습니다 것 같아요. 시간을 절약, 몇 가지 "모범 사례"를 적용 할 수있는, 다른 프로젝트와 유사한 기준 등을 얻을 것이다 여기에 다른 IOC의의 +에 대한 몇 가지 지침은 3

+1

+1은 예제에서 생성자 삽입을 사용하고 DI 컨테이너를 사용하지 않고 수동으로 수행 할 수 있음을 보여주는 예제입니다. –

+0

@SamHolder 정확히는 컨테이너가 "마술"처럼 보이더라도 모든 것이 수동으로 수행 될 수 있습니다. 이 모든 도구의 기능은 정말 훌륭하다고 생각합니다. 선택해야 할 문서의 맛과 품질에 관한 문제 일뿐입니다. – Tx3

+0

아,이 말이 맞습니다. 이 답변을 주셔서 대단히 감사합니다! – Patrick

0

데저트 컨테이너는 생성하고이하도록 구성된 유형에 대한 종속성을 해결합니다. 응용 프로그램 계층을 어떻게 디자인 할 것인가와 관련이 없습니다. 필요한 곳에 저장소를 전달하고 싶지 않으세요?! 이러한 객체는 구현이 아닌 추상화에 의존합니다.

필요한 경우 리포지토리의 특정 인스턴스를 제공하도록 DI 컨테이너를 구성합니다. 컨트롤러는 저장소 인스턴스를 수신 한 다음 사용할 비즈니스 계층으로 전달할 수 있습니다.

디커플링이란 개체가 구현 세부 사항에 종속되지 않는다는 것을 의미합니다. 의존성이 인터페이스로 표현되고이를 조롱 할 수 있기 때문에 테스트가 가능합니다.

+0

OP는 컨트롤러에 저장소를 전달하고 싶지 않다는 의미이므로 비즈니스 논리 클래스에 전달할 수 있습니다. 음, 어쨌든 그렇게 생각합니다. –

2

MVC이다 간단히 말해, 계층 구조의 각 계층은 생성자 인수 (인터페이스)를 통해 다음 계층에 대한 종속성을 묻습니다.

컨트롤러는 생성자를 통해 비즈니스 로직에 대한 의존성을 요구합니다. 이들은 특정 구현을 요구하지 않고 비즈니스 로직에 대한 인터페이스에 대한 의존성으로이를 수행합니다. 비즈니스 로직 클래스를위한 인터페이스를 생성하고 컨트롤러에 해당 인터페이스의 구현을 주입합니다.이 작업은 수동으로 수행 할 수도 있고 DI 컨테이너를 사용하여 수행 할 수도 있습니다. 컨트롤러는 리포지토리 클래스 (또는 비즈니스 로직 구현의 다른 모든 종속성)에 대해 아무것도 알지 못하고, 비즈니스 논리 클래스에 대한 인터페이스에 대해서만 알고 있습니다.

그런 다음 비즈니스 로직 구체화 클래스를 린스하고 반복하십시오.

리포지토리 클래스와 해당 비즈니스 로직 클래스에 대한 인터페이스를 생성자가 생성자를 통해 요청하는 인터페이스를 만든 다음 수동으로 또는 DI 컨테이너를 통해 종속성을 다시 주입합니다.

응용 프로그램은이 설정이 모두 이루어지는 구성 루트가 있어야합니다.이 설정은 종속성을 수동으로 연결합니다 (가장 낮은 개체를 먼저 만든 다음 상위 개체의 생성자에 전달 함). 그것들을 생성한다), 또는 가지고있는 다양한 인터페이스 구현의 세부 사항으로 컨테이너를 설정하면, 그 정보를 사용하여 의존성을 가진 객체를 올바르게 생성 할 수있다.