2012-11-12 3 views
3

Ninject를 사용하려고하는 MVC를 사용하는 늪지 표준 3 단계 프로젝트에 문제가 있습니다. 나는 MemberRepository있어 :Ninject 및 MVC를 사용하는 서비스 계층에 대한 종속성

public class MemberRepository : IMemberRepository{ 
    public bool Save(Member member){ 
      //saves member 
    } 
} 

난 다음 내 서비스 계층이 : 내 AccountController를 설정 나를 가장 좋은 방법이 무엇인지 Ninject에 사용할 것입니다 감안할 때

public class MemberService : IMemberService{ 
    public bool Register(string email){ 
     //Do Stuff & Populate Member Object 
     _repo.Save(member); 
    } 
} 

. 그래서 같이 생성자에 MemberService 전달해야 :

public class AccountController : Controller 
{ 
    IMemberService _memberService; 

    public AccountController(IMemberService memberService) 
    { 
     _memberService = memberService; 
    } 
} 

또는 저장소에 전달합니다

public class AccountController : Controller 
{ 
    IMemberService _memberService; 

    public AccountController(IMemberRepository memberRepo) 
    { 
     _memberService = new MemberService(memberRepo); 
    } 
} 

또는 둘 모두를?

나는 원래 저장소 (서비스 계층 없음)가 있지만 서비스 계층을 구현해야하고 내 NinjectWebCommon.cs 파일에 kernal을 등록 할 때 '종속성'을 처리하는 방법을 모르겠습니다. .

kernel.Bind<IMemberRepository>().To<SqlMemberRepository>(); 

하지만이 IMemberService을 등록해야 및 매개 변수의 일종으로 환매 특약이있는 경우 지금 궁금하네요 : 어떤 원래 그냥이 있었다.

: s 실종 느낌. 희망을 나는 이해하고 누군가가 도울 수 있기를 바랍니다.

+0

서비스와 저장소는 모두 종속성이므로 컨트롤러에 둘 다 삽입하는 것이 가장 좋습니다. –

답변

6

나는 Ninject를 한번도 사용하지 않았지만, Unity를 사용 해왔다.하지만 같은 원리가 존재하므로 잘하면 도움이 될 것이다.

서비스 계층은 컨트롤러에 노출되는 것입니다. 컨트롤러는 기본 저장소에 대해 아무 것도 알 필요가 없습니다. 다음과 같이 흐름은, 각각의 층 위에있는 레이어에 대해 알고하지 않습니다

컨트롤러 -

그래서 나는의 생성자에 저장소를 주입 한 후 옵션 1로 이동 한 것입니다> 서비스> 저장소 서비스.

public class MemberService : IMemberService { 
    private readonly IMemberRepository _repo; 

    [Inject] 
    public MemberService (IMemberRepository repo){ 
     this._repo = repo; 
    } 

    public bool Register(string email){ 
     //Do Stuff & Populate Member Object 
     _repo.Save(member); 
    } 
} 

예를 분명히 생성자 주입을 사용하지만 대신하려는 경우 부동산/필드 주사를 사용할 수
public class AccountController : Controller 
{ 
    private readonly IMemberService _memberService; 

    [Inject] 
    public AccountController(IMemberService memberService) 
    { 
     _memberService = memberService; 
    } 
} 

. 종속성을 등록 할 때 다음 두 가지를 모두 등록해야합니다.

kernel.Bind<IMemberRepository>().To<SqlMemberRepository>(); 
kernel.Bind<IMemberService>().To<MemberService>(); 
+0

소용돌이 치다. 감사합니다 이안. – lloydphillips

+0

어떻게 시작하셨습니까? 행운? –

관련 문제