2009-11-30 5 views
2

우선, 내가 사용 Ninject에 2.0Ninject에와 마스터 페이지 주입

는 내가에 주입하고자하는 내 마스터 페이지를하지만 난 방법을 아주 확실하지 않다. 내가 System.Web.Mvc.ViewMasterPage에서 파생되는 클래스를 생성 시도하고 내 속성을 만들 : 나는 속성을 설정받을 둘의 내 페이지를 실행하고 모두 null의 경우

[Inject] 
public ICacheService<List<Category>> Categories { get; set; } 
[Inject] 
public IConfigurationSettings Config { get; set; } 

합니다. 왜 또는 어떻게 이것을 수행하는 방법에 대한 모든 아이디어? 감사합니다

- 업데이트

그래서 나는 더 많은 연구를했고 내가 Ninject에 클래스의 생성을 차단하지 않기 때문에 클래스 내 자신을 개체를 해결해야합니다 보인다. 그래서 지금 내 질문은 커널 용 리졸버를 어떻게 만듭니 까? 위의 코드는 클래스 라이브러리 내에 있으므로 커널에 대한 참조가 없습니다.

public class KernelResolver 
{ 
    private static IKernel _kernel; 

    public KernelResolver(IKernel kernel) 
    { 
     _kernel = kernel; 
    } 

    public static T Resolve<T>() 
    { 
     return _kernel.Get<T>(); 
    } 
} 

을 (약간 http://www.codethinked.com/post/2009/10/07/Our-Biggest-Enemy-Isne28099t-Developers-Who-Refuse-To-Move-Forward-It-is-Developers-Who-Pretend-To-Move-Forward.aspx에서 변경) 한 후 등록 : 나는 다음과 같은 노력

Bind<KernelResolver>().ToSelf() 

아직 커널이 null을 ... 난 그냥 몇 가지 예를 볼 필요가 있지만, 나는 어떤을 찾을 수 없습니다 또는 내가 혼란스러워서 내가 뭘 찾고 있는지 모르겠다. \

어떤 도움을 많이 받으실 수 있습니다!

답변

3

먼저 마스터 페이지에 무엇을 삽입하고 싶습니까? MVC를 사용하는 경우 모델을 사용하여 컨트롤러를 통해 뷰 (마스터 페이지 포함)에 데이터를 전달하려고합니다. MVC 프레임 워크의 핵심은 과도하게 단순화 된 경우입니다.

Ninject 또는 다른 IoC 컨테이너가 컨트롤러 클래스를 작성하고 종속성을 주입하는 데 도움이됩니다. 실제로 ASP.Net의 IoC 컨테이너에 대한 통합 지점은 일반적으로 컨트롤러 팩토리의 책임을 대신합니다.

컨트롤러에 적절한 종속성을 주입하면 컨트롤러가 마스터 페이지를 포함하여보기에 전달할 모델 또는 모델의 적절한 모델을 결정하는 데 도움이 될 수 있습니다.

컨트롤러 클래스에서 모든 의사 결정 (즉, 컨트롤)의 책임을 맡는 것으로 MVC 패턴 (그리고 ASP.Net MVC)을 생각하고 싶습니다.제어기에 의해 수행되는 결정은 다수의 입력 (예를 들어, 구성, 사용자 입력, 환경 등)에 의해 형성 될 수 있지만, 어느 시점에서 제어기에 의해 모델이 뷰로 전달된다. 시스템의 주제가 포함 된 모델을 생각합니다. 내 견해로는 특히 ASP.Net MVC에서의 견해는 어떤 객체 모델에서는 진정한 클래스 나 일류 cititzens보다 "스크립트"와 같은 논리가없는 것으로 가장 잘 간주됩니다.

아마도보기 마스터 페이지를 "더 똑똑하게"만들 수있는 타당한 이유가있을 수 있지만 일반적으로 삽입하려는 대상 유형이 컨트롤러에 주입되고 필요한 데이터가보기로 전달됩니다. 나는 당신이 성취하고자하는 것에 대해 더 많이 듣고 싶어 할 것입니다.

참고 : MVC와의 Ninject 통합을 설정하여 모든 컨트롤러의 종속성을 쉽게 주입 할 수 있습니다. 자세한 내용은이 StackOverflow question/answer 스레드를 확인하십시오.

+0

"ASP.Net의 IoC 컨테이너 통합 지점은 일반적으로 컨트롤러 팩토리의 책임을 대신합니다." - 엄청난 일들이 정리됩니다. 내가 성취하려고 시도한 것은 마스터 페이지를 포함하여 컨트롤러를 통해 전달되지 않고 자동으로 모든 페이지에서 내 구성 설정을 사용할 수있게하는 것이 었습니다. 그래서 컨트롤러를 통해 모든 모델을 내 모델에 전달해야합니다. 나는 나무처럼 상상하고, 꼭대기에있는 컨트롤러와 주입은 필요에 따라 아래쪽으로 흘러 간다. – DennyFerra

+0

그리고 분명히 말하자면, DI는 검사 점과 같았고 응용 프로그램의 모든 인스턴스는이 "검사 점"을 통과하여 필요한 시점에 객체를 검사하고 주입하는 것이 었습니다. – DennyFerra

+0

나는 물체가 흐르면서 "위쪽"에서 컨트롤러를 보는 것이 흐름을 시각화하는 좋은 방법이라고 생각합니다. 이제 당신이하려고했던 것을 이해합니다. 이것은 정말로 논리적입니다. 모든 페이지에서 공유하려는 설정의 종류와 해당 설정이 응용 프로그램의 동작 (또는 기타)을 변경하는 방법에 대해 생각할 수 있습니다. 아마도 그것은 모델에 적용될 수 있습니까? –

1

KernelResolver 클래스는 일반적으로 기본 접근 방식보다 최후의 수단 인 서비스 로케이터 패턴 (사용자의 의존성에 대해 [중앙]을 묻습니다)을 구현합니다. 당신이 정말로 원하는 것은 당신의 의존성 주입을 작동시키는 것입니다.

BindKernelResolver은 전체 컨테이너로 작동하지 않으며 시스템 (예 : MVC의 공장)이 도움을 받으려면 연결해야합니다.

[Inject] 속성은 마법 자체를 수행하지 않습니다. 누군가가 그 유형의 객체를 주입하도록 요청할 때 Ninject에서 사용합니다.

MVC가 적절한 시간에 Ninject를 호출하도록 지정하는 방법에 대한 예가 있습니다.이 예제에서는 ninject "asp.net mvc"예제를 검색 할 수 있습니다.