2011-07-06 4 views
20

ASP MVC 3 응용 프로그램에서 작업하고 사용자 지정 html 도우미를 쓰고 있습니다. 그것은 특별한 것이나 복잡하지는 않지만 구조지도의 인터페이스 인스턴스가 필요합니다. 메서드 내에서 구조체 객체 팩토리를 호출 할 수는 있지만, 나머지 응용 프로그램은 서비스 위치가 아닌 IoC를 사용하므로이 방법을 계속 사용하고 싶습니다.확장 메서드에서 IoC 사용

내부 및 asp net mvc app에서 확장 방법에 인터페이스를 삽입하는 방법이 있습니까?

UPDATE

내가 도움이 될 뭘하는지의 예 : 다음과 같이 사용된다

public static class ShowUrl 
{ 
    public static string ForShow(this UrlHelper url, int showId) 
    { 
     var service = ObjectFactory.GetInstance<IPerformanceService>(); 

     var showName = service.GetPerformanceTitle(showId); 

     return url.Action(MVC.Performance.Details(showId, showName.ToFriendlyUrl())); 
    } 
} 

: 나는 URL을 구축을 위해 노력하고

기본적으로
<a href='<%= Url.ForShow(1)%>'> 

엔티티 ID의 슬러그와 어쩌면 나는이 일을 정말로 어리석은 방식으로 진행할 것입니다.

+0

것은 당신이 MVC DependencyResolver를 사용하고 있습니까? – mccow002

답변

6

확장 방법에 종속성을 주입 할 방법이 없습니다.

ASP.NET MVC 도우미의 경우, 일종의 추상화로 묻어 버렸는지 여부와 상관없이 서비스 위치를 수행해야 할 것입니다.

+3

메소드 인수 (메소드 삽입)로 종속성을 전달하기 만하면 확장 메소드에 종속성을 주입 할 수 있습니다. 그러나 특히 여러 종속성을 전달할 필요가있을 때 편리하지는 않습니다. – Steven

+1

좋은 지적. 원래 정확히 데모 코드가 포함되어 있었지만 최종 결과가 더 예민하지 않다는 것을 알게되었습니다. –

21

이 작업을 수행하지 않는 것이 좋습니다. 확장 메서드는 일반적으로 형식에 대해 간단하고 잘 알려진 작업에 가장 잘 사용됩니다. 확장 메서드가 다른 형식의 인스턴스를 사용하는 것에 종속되어 있으면 먼저 확장 메서드가 아니어야합니다.

이 기능을 수행하고 필요한 곳으로 주입하는 실제 서비스 클래스를 만드는 것을 고려하십시오. 확장 메소드에서 이것을 정말로 필요로한다면, 확장 메소드가 다른 정적 클래스/메소드에서 요구하는 기능을 랩핑하고 어떤 종류의 주입이나 위치를 사용하지 않도록하십시오.

일부 코드를 공유하면 특정 상황에 더 많은 빛을 줄 수 있습니다.

6

확장 메서드에서 직접 structuremap을 호출하면 안됩니다.

public static class ShowUrl 
{ 
    public static string ForShow(this UrlHelper url, int showId) 
    { 
     //Use the MVC DependencyResolver NOT Structuremap directly (DependencyResolver is using structuremap) 
     return url.ForShow(showId, DependencyResolver.Current.GetService<IPerformanceService>()) 
    } 

    //For Unit Testing 
    public static string ForShow(this UrlHelper url, int showId, IPerformanceService performanceService) 
    { 
     var showName = performanceService.GetPerformanceTitle(showId); 
     return url.Action(MVC.Performance.Details(showId, showName.ToFriendlyUrl())); 
    } 
} 

지금 당신은 당신의 단위 테스트 방법에 IPerformanceService의 구체적인 구현에 전달할 수 있습니다 또한, 다음과 같은 IPerformanceService 인수를 시험 가능한 버전을 만들어야합니다. UrlHelper을 조롱에

Assert.Equal("TheUrl", url.ForShow(8, new PerformanceService()); 

상세 정보 : ASP.NET MVC: Unit testing controllers that use UrlHelper

관련 문제