3

나는 웹 서비스를 구현하는 ASP.NET MVC 2를 사용하고 있는데 나는 사용자 정의 JsonResult 클래스가 :Ninject를 사용하여 정적 속성을 주입하는 방법은 무엇입니까?

public abstract class JsonResult : ActionResult 
{ 
    public static ISerializer Serializer { get; set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     var json = Serializer.Serialize(this); 
     context.HttpContext.Response.Write(json); 
    } 
} 

JsonResult는 JSON 데이터로 직렬화해야 모든 결과에 대한 추상 기본 클래스입니다. 그것은 ISerializer을 사용하여 직렬화를 수행합니다.

IoC 컨테이너로 Ninject를 사용하고 있습니다. 그러나, 나는 어떻게 내가 ISerializer 종속성을 주입해야하는지 잘 모르겠다. 나는 원래 이것을하고 있었다 :

var kernel = new StandardKernel().Bind<ISerializer>().To<JsonNetSerializer>(); 
JsonResult.Serializer = kernel.Get<ISerializer>(); 

그러나 그것에 관해 무엇인가 아주 올바르게 보이지 않는다. 그러면 Serializer 속성을 올바르게 주입하는 방법은 무엇입니까? 응용 프로그램이 시작될 때 한 번만 주입하고 싶습니다.

답변

4

죄송합니다, MVC 내 리그가 아니라, 당신이 싱글이 될하기 위해 static 수정, JsonNetSerializer의 설정 수명을 제거 할 수 없습니다, 그리고 그 JsonResult의 생성자에 주입 이유 몇 가지 이유가있다? 특히 이것은 ISerializer에 대한 의존성을 명시 적으로 나타내며 (좋은 점) static (좋은 점)을 피한다.

+0

그래서 'Serializer'속성을 싱글 톤으로 유지하려면 항상 IoC 컨테이너를 사용하여'JsonResult'의 인스턴스를 인스턴스화해야합니다. –

+1

@Daniel T .: 가능한 한 공장을 사용해야합니다. 그래서'ConcreteJsonResult'를 인스턴스화하는 클래스가 있다면'JsonResultFactory'를 취해야합니다. 물론'return kernel.Get ();'의 라인을 따라'JsonResultFactory.Create '을 만들 수 있습니다. – jason

+0

Jason에게 감사드립니다. 나는 항상 공장을 만드는 것을 피했습니다. 왜냐하면 제 응용 프로그램이 너무 단순해서 공장을 사용하는 것이 불필요하게 복잡 해지는 것 같지만, 한번 시도해 보겠습니다. –

관련 문제