2011-12-15 4 views
3

현재 MVC3을 사용하는 웹 응용 프로그램을 개발 중입니다. MVC3 프로젝트는 서비스 계층을 통해 애플리케이션 로직에 액세스합니다. 서비스 계층은 UnitOfWork 패턴을 통해 액세스되는 저장소를 사용하여 데이터베이스에 액세스합니다.서비스 클래스에 대한 종속성 주입이 컨트롤러에 주입되었습니다.

MVC3 프로젝트에 서비스를 삽입하기 위해 StructureMap을 설치했습니다. 예제 컨트롤러 지금이

public class AccountManagementController : Controller 
{ 
    IAccountService accountService; 

    public AccountManagementController(IAccountService accountService) 
    { 
     this.accountService = accountService; 
    } 

과 같을 것이다, 내 문제는 내 AccountService에 클래스 구조의 맵을 만들 때 UnitOfWork에 주입 가질 필요가 있다는 것입니다. 현재 저는 2 개의 컨트롤러를 가지고 있습니다. 하나는 인터페이스를 사용하고 다른 하나는 구체적인 클래스를 인스턴스화합니다.

public class AccountService : IAccountService, IDisposable 
{ 
    private IUnitOfWork unitOfWork; 

    internal AccountService(IUnitOfWork unitOfWork) 
    { 
     this.unitOfWork = unitOfWork; 
    } 
    public AccountService() 
    { 
     this.unitOfWork = new UnitOfWork(); 
    } 

이것은 코드 냄새처럼 보입니다. 이것을 처리하는 더 정확한 방법이 있습니까?

덕분에, AFrieze

+4

기본 생성자를 삭제하십시오 ... –

+0

StructMap 구성을위한 유창한 인터페이스가 수년 동안 변경되어서 어떤 코드가 어떤 버전에서 작동하는지 구체적으로 알지 못합니다. 그러나 필요하다면 부트 스트 래퍼 코드에 특정 'IUnitOfWork' 구현체를 사용하도록 지시 할 수 있어야합니다. 여기 좀보세요 : http://stackoverflow.com/q/289512/328193 – David

+0

고마워, 내가 살펴 보겠습니다. 이것은 내가 일반적으로 피해야 할 내 웹 사이트에서 내 DAL에 대한 참조를 요구할 것입니다. – AFrieze

답변

1

에 AccountService에의 의존도를 해결할 수 있도록 종속성을 계단식으로 할 수 있지만 ...

한다 AFAIK, StructureMap은 항상 가장 많은 인수를 가진 생성자를 선택하므로 IUnitOfWork 종속성을 해결하는 동안 문제가되지 않습니다.

반면에 IDisposable은 나에게 냄새가 나는 것처럼 보입니다. 그런 일회용 인스턴스를 처리하는 방법 AFAIK structureMap의 조언 :

  • 우리는 비 일회용 래퍼로 처분 할 수있는 서비스를 포장한다. 일회용이 아닌 래퍼는 인스턴스 wrapps를 처리해야합니다.
  • 우리는 처분 할 수없는 서비스 공장을 일회용이 아닌 포장지에 주입해야합니다.

이 두 가지 경우에 우리는 소비자에게 일회용 서비스를 직접 주입하는 포장지를 주입합니다.

structureMap에 대해서는 일회용 인스턴스를 추적하는 중첩 컨테이너 기능을 활용할 수도 있습니다. 따라서 중첩 된 컨테이너가 배치되면 모든 객체 그래프가 해제됩니다.

1

나는만큼 아무 냄새가 나지 않는 의견 제안처럼, 당신은 AccountService에에서 기본 매개 변수가없는 생성자를 제거합니다. 어떤 점잖은 IoC 컨테이너는 AccountManagementController에 IAccountService를 주입 할 때 마크가 나는 기본 생성자를 삭제 것이라고 제안한 것처럼, 그것은 IUnitOfWork

관련 문제