1

I가 3 개 프로젝트 파일 내 서비스 레이어 프로젝트에 IOC (코드) 코드를 어디에 두어야합니까?

webui - controllers and views 
framework - service layer and repos 
tests- unit tests 

그래서 내가 볼 어떻게 내 컨트롤러 만 (즉, 내 비즈니스 로직을 포함) 내 서비스 계층에게 이야기하는 것입니다. 서비스 계층은 repos와 대화하고 데이터베이스 데이터를 가져옵니다.

내 저장소는 데이터베이스를 수행하고 데이터를 반환합니다.

이제 단위 테스트를하고 싶다면 위조 된 서비스 계층과 가짜 저장소가 필요합니다.

이 방법을 사용하면 격리 된 컨트롤러와 격리 된 서비스 레이어를 테스트 할 수 있습니다.

그래서 내 서비스 계층에서 사용할 수 있도록 프레임 워크 클래스 라이브러리에 내 발단 코드를 두어야합니까?

스티븐 당신은 내가 MVC 확장 글로벌 영문이

// 설정 Ninject에 같은 일을해야 말하는

편집

// 이제 물건을 결합

private class SportsStoreServices : NinjectModule 
     { 
      public override void Load() 
      { 

       Bind<IAdminService>().To<AdminService>(); 
       Bind<IAdminRepo>().To<AdminRepo>(); 
      } 
     } 

// 컨트롤러

public class AccountController : Controller 
    { 
     // 
     // GET: /Account/ 

    private IAdminService adminService; 

public AccountController(IAdminService adminService) 
     { 
    this.adminService = adminService; 
} 


     public ActionResult Login() 
     { 
      var getAllAdmins = adminService.GetAllAdmins(); 
      return View(); 
     } 

    } 

// 서비스 레이어

public class AdminService : IAdminService 
{ 

    private IAdminRepo adminRepo; 
    public AdminService(IAdminRepo adminRepo) 
    { 
     this.adminRepo = adminRepo; 
    } 

    public List<Admins> GetAllAdmins() 
    { 

     return adminRepo.GetAllAdmins(); 
    } 

} 


//Repo 
    public class AdminRepo : IAdminRepo 
    { 
     public List<Admins> GetAllAdmins() 
     { 
      // some query to get all admins 
     } 
    } 
+0

ninject.web.mvc를 사용하고 있습니까? https://github.com/ninject/ninject.web.mvc – dotjoe

+0

서비스 레이어는 Ninject에 대해 아무것도 모릅니다. – dotjoe

+0

현재 해당 사항 없음. 나는 방금 webui 부분으로 내 문제를 해결하지 않을 것이라고 asp.net mvc 2.0 프로. 서비스 계층이 아닙니까? (자체 프로젝트 폴더에 repo 클래스와 함께있는 내용은 무엇입니까?) – chobo2

답변

5

올바르게 (완전히) 당신이 당신의 IoC 컨테이너가 귀하의 경우 귀하의 웹 프로젝트 (응용 프로그램 루트에 참조 할 필요가있는 유일한 장소를 의존성 삽입 패턴을 따르). MVC의 경우 일반적으로 특정 IoC 프레임 워크를 사용하여 새 컨트롤러를 만드는 방법을 알고있는 ControllerFactory이 있습니다. 컨트롤러는 생성자 삽입을 중심으로 설계되므로 IoC 프레임 워크는 모든 종속성을 자동으로 주입 할 수 있습니다. 일반적으로 전체 프로젝트에서 생성자 주입을 사용합니다. 이렇게하면 나머지 코드가 선택한 IoC 구현을 알지 못하게 할 수 있습니다.

단위 테스트의 경우 일반적으로 생성자 삽입을 사용하여 수동으로 종속성을 주입합니다. 이렇게하면 단위 테스트를 위해 IoC 프레임 워크를 구성하지 않아도됩니다. 테스트 프로젝트에서 IoC 라이브러리를 사용하는 것은 고통 스럽습니다. 테스트 케이스별로 서로 다른 종속성을 반환하고 테스트 프레임 워크에서 종종 테스트를 병렬로 실행하기 때문입니다. 그래서 최선은 이 아니며은 테스트에서 IoC 프레임 워크를 사용하지만 직접 테스트중인 유형의 생성자를 호출하십시오.

DI를 사용한 단위 테스트의 트릭은 단위 테스트를 유지 관리하는 것입니다. 예를 들어, 테스트중인 유형의 생성을 팩토리 메소드로 추출하여이를 수행 할 수 있습니다. 이렇게하면 코드에서 한 곳에서 그러한 생성자를 호출 할 수 있습니다. 생성자가 변경되면 테스트 코드를 한 곳에서 변경해야합니다. The Art of Unit Testing 책으로 유지 보수 가능한 단위 테스트 작성에 대해 많은 것을 배웠습니다. 나는 그것을 추천 할 수있다.

1

DI는 객체 구성이 일어날 수있는 장소에 있어야합니다. 예를 들어 WCF 서비스 프로젝트에서 우리는 IInstanceProvider IN asp.net Global.asax를 사용하여 수행 할 수 있습니다. 기본 규칙 : DI가 응용 프로그램 시작 지점인지 확인하십시오

관련 문제