2009-11-10 6 views
4

내 뷰를 구현하고 페이지 구성자에 발표자를 만드는 ASP.NET 페이지가 있습니다. Phil Haack's post providing was used as the starting point, 나는 그 질문을 설명하기위한 게시물의 예제만을 다룰 것이다.ASP.NET MVP 서비스 종속성 삽입

public partial class _Default : System.Web.UI.Page, IPostEditView { 

    PostEditController controller; 
    public _Default() 
    { 
     this.controller = new PostEditController(this, new BlogDataService()); 
    } 
} 

BlogDataService의 인스턴스를 삽입하는 가장 좋은 방법은 무엇입니까? 내가 찾은 예제는 사출 프레임 워크가 해결하는 속성으로 표시된 종속성에 대해 Page 클래스의 속성을 사용합니다.

그러나 테스트 목적으로 생성자 방식을 사용하는 것을 선호합니다.

누구나 위의 좋은 구현에 대한 입력 또는 링크가있을 수 있습니다. 나는 Ninject를 선호 할 것이지만, StructureMap이나 Windsor는 유창한 한 괜찮을 것입니다.

의견을 보내 주셔서 감사합니다.

답변

1

Microsoft ServiceLocator을 사용하는 경우 service locator design pattern을 적용하고 컨테이너에 서비스를 요청할 수 있습니다.

귀하의 경우는 다음과 같이 보일 것입니다 :

public partial class _Default : System.Web.UI.Page, IPostEditView { 

    PostEditController controller; 
    public _Default() 
    { 
     var service = ServiceLocator.Current.GetInstance<IBlogDataService>(); 
     this.controller = new PostEditController(this, service); 
    } 
} 

ServiceLocator는 윈저 성 및 StructureMap에 대한 구현이 있습니다. Ninject에 대해서는 확신 할 수 없지만 새로운 IoC를위한 ServiceLocator 어댑터를 만드는 것은 간단합니다.

+0

나는 그것을 좋아한다, 고마워. – blu

+0

이 방법을 사용하면보기가 현재 발표자에게만 알려 져야하는 IBlogDataService를 알 수 있습니다. 현재 뷰 객체와 구성된 IBlogDataService 인스턴스를 전달하는 DI 컨테이너를 사용하여 표현자를 구성하는 방법이 있습니까? – Scott

+0

서비스 로케이터 사용은 IoC에 대한 패턴 방지로 간주됩니다. 더 좋은 방법이 있어야합니다. –

1

웹 폼에서 생성자 주입을 수행하는 일반적인 용도를 보지 못했습니다. PageFactory 구현을 통해 가능할 수도 있다고 가정합니다. 그러나 가장자리의 대부분이 현재 웹 폼이 아닌 MVC로 이동하고 있기 때문에 그렇게되지 않을 수 있습니다.

그러나, autofac (나는 많은 마음에 드는 DI 컨테이너) 속성없이 속성 주입 않는 integration module for ASP.NET WebForms있다 - 당신의 코드는 다음과 같습니다

public partial class _Default : System.Web.UI.Page, IPostEditView { 

    public IBlogDataService DataService{get;set;} 
    public _Default() 
    { 
    } 
} 

나는이 특별히 당신의 욕망을 해결하지 않습니다 알고 생성자 삽입을 사용하지만 이것은 내가 아는 가장 가까운 것이다.

+0

컨테이너는 생성자 코드가 호출되기 전에 속성이 설정되도록 보장합니까? 작은 닭고기와 나에게 달걀을 느낀다. – blu

+0

아니요, 생성자가 호출 된 후 속성이 설정됩니다. 웹 폼의 고통 중 하나인데, 두렵습니다. –

+0

ServiceLocator 대신 autofac을 사용했지만 결국 Neil이 위의 스타일을 사용했습니다. 고마워. – blu

2

자체 개발 한 MVP 프레임 워크에서 우리는 모든 Pages가 상속 한 기본 클래스를 입력했습니다. Presenter 유형 (기본 표현 자 클래스)이어야하는 유형

기본 클래스에서 우리는 IoC 컨테이너를 사용하여 컨트롤러를 초기화했습니다.

샘플 코드 :이 도움이

public class EditPage : BasePage<EditController> { 
} 

public class EditController : Presenter { 
public EditController(IService service) { } 
} 

public class BasePage<T> : Page where T: Presenter 
{ 
T Presenter { get; set; } 
public BasePage() { 
    Presenter = ObjectFactory.GetInstance<T>(); //StructureMap 
} 
} 

희망!