2009-12-08 3 views
1

제 애완 동물 프로젝트에서 DI 컨테이너로 터빈을 사용하는 방법을 배우려고합니다.매개 변수화 된 컨트롤러 생성자가 절대 실행되지 않습니다.

static MvcApplication() 
{ 
    ServiceLocatorManager.SetLocatorProvider(() => new UnityServiceLocator()); 
} 

내 사용자 저장소가 매개 변수없는 생성자가 나는 등을 등록하고 있습니다 :

나는 같은 locatorprovider 등의 단결을 등록하고있어 다음

public class UserRepositoryRegistration : IServiceRegistration 
{ 
    public void Register(IServiceLocator locator) 
    { 
     locator.Register<IUserRepository, UserRepository>(); 
    } 
} 

내 HomeController이있는 IUserRepository를 받아 들여야합니다.

public class HomeController : Controller 
{ 
    private readonly IUserRepository userRepository; 

    public HomeController(IUserRepository repository) 
    { 
     userRepository = repository; 
    } 
} 

매개 변수없는 ct 또는 (위의 코드처럼) 내가 얻을이 (full here) :

 
Server Error in '/' Application. 
No parameterless constructor defined for this object. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
Exception Details: System.MissingMethodException: No parameterless constructor defined for this object. 
[InvalidOperationException: An error occurred when trying to create a controller of type 'Boris.BeekProject.Guis.Web.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.] 

그래서 내 HomeController는 parless의의 ctor를 할 의무가있다. 인스턴스화하는 유니티 컨트롤러 팩토리가 아니라 디폴트 컨트롤러 팩토리 인 것 같습니다.

UPDATE는
내 MVCApplication는 TurbineApplication를 상속하고 RouteRegistration이 잘 포착되어 있기 때문에 그 문제는 다른 곳에있다 생각합니다. 토마스 Eyde에 의해 제안

UPDATE
은 내가 TurbineApplication.AutoComponent 메소드를 오버라이드 (override) 싶었지만, 개체 브라우저를 확인,이 방법에 대한 참조를 볼 수 없습니다. NerdDinner 예제를 보면이 메서드를 재정의하는 것처럼 보이지 않습니다. online documentation about it을 확인한 후 더 현명하지 못하고 문서에 대한 링크를 따라 doing the registration manually에 관해서는 자리 표시 자 페이지를 제공합니다. 누군가 내가 잘못하고있는 것에 나를 채울 수 있습니까?

내가 누락 된 항목이 있습니까?

+1

또한이 예외의 형식에 대한 힌트가 유용 할 것입니다. 메타에 관련된 문제를 게시했습니다 : http://meta.stackexchange.com/questions/32264/posting-a-stack-trace –

+0

TurbineApplication 클래스를 상속 받았습니까? Global.asax MvcApplication 클래스? –

+0

@Magnus : 예, TurbineApplication에서 상속됩니다. 이상한 것은 IRouteRegistration이 잘 선택되었다는 것입니다. –

답변

1
터빈의 빌드는 ControllerFactory가를 지원하도록 변경되는 MVC2를 지원하지 않습니다

컨트롤러 생성을위한 추가 매개 변수. 이것은 컨트롤러가 올바르게 인스턴스화되지 않는 이유를 설명합니다. 당신이 당신의 개발 (.NET4에 대한) MVC2 베타를 사용하고자하는 경우 The breaking changes of MVC2 list this change.

, 나는 당신이 당신을 도와줍니다 새로운 MVC2 (.NET4) bits I just released.

희망을 얻을 제안!

+0

감사합니다. 나는 최근에이 애완 동물 프로젝트를위한 시간이 없었지만, 다음 주에는 생각할 시간을 가질 것입니다. 나는 그것을 확실히 체크 아웃 할 것이다. 고마워요 :) –

+0

문제 없어요, 보리스. 나는 완전히 이해한다. 한 가지 질문입니다. MVC2와 함께 터빈을 .NET4 또는 .NET3.5와 함께 사용하고 있습니까? 이유는 내가 터빈을 .NET3.5 위에서 실행되는 MVC2 RC 비트에 대해 컴파일하는 과정에 있기 때문입니다. 따라서이 업데이트에서도 이점을 누릴 수 있습니다. –

+0

안녕 하비에르, 내 다양한 ​​질문에 지금까지 지원 주셔서 감사합니다 :) 그것은 여전히 ​​평범한 오래된 3.5;) –

1

당신은이 같은 뭔가 TurbineApplication.AutoComponentSetup -method를 오버라이드 (override) 할 필요가 :

protected override void AutoComponentSetup(IServiceLocator locator) 
{ 
    //Remove this if you want to skip all other previous registrations 
    base.AutoComponentSetup(locator); 

    AutoRegistration<IMyCustomInterface>((loc, type) => loc.Register<IMyCustomInterface>(type)); 
} 

참조 또한 Auto Registration for Components

+0

아, 그래, 아마도 그 간격을 채 웁니다 :) 덕분에 –

+0

그것을 테스트 후, 그것은 결국 작동하지 않았다. OP에서 업데이트를 참조하십시오. –

관련 문제