2012-09-28 9 views
0

우리 응용 프로그램에서 Ninject를 사용하여 서비스를 바인딩하고 생성자 인수를 지정하려고합니다. 생성자 인수는 쿼리 문자열 또는 쿠키에서 가져올 수있는 값입니다. 현재 가지고있는 코드는 다음과 같습니다.Ninject 호출자가 반환하는 메서드 생성자 인수

kernel.Bind<SomeService>() 
     .ToSelf() 
     .InRequestScope() 
     .WithConstructorArgument("someID", ctx => 
      // Try to get it from the posted form values 
      System.Web.HttpContext.Current.Request.Form["someID"] != null ? 
      long.Parse(System.Web.HttpContext.Current.Request.Form["someID"]) :           

      // Try to get it from the query string 
      System.Web.HttpContext.Current.Request.QueryString["someID"] != null ? 
      long.Parse(System.Web.HttpContext.Current.Request.QueryString["someID"]) 

      : 0); 

이 코드는 작동하지만 꽤 못생긴 코드입니다. FormValue 또는 QueryString 값을 매개 변수로 전달하는 등의 다른 방법으로이 작업을 수행 할 수 있다는 것을 알고 있지만 Binding에 정의하는 것이 좋습니다. 우리가 이상적으로하고 싶은 것은 다음과 같습니다.

kernel.Bind<SomeService>() 
      .ToSelf() 
      .InRequestScope() 
      .WithConstructorArgument("someID", ctx => GetSomeID()); 

내가 알 수있는 바로는 이것은 불가능합니다. 생성자 인자 주입 로직을 다른 메소드로 분해 할 수있는 또 다른 방법이 있나요? 그래서 우리는 하나의 if 문을 중첩 할 필요가 없습니까?

답변

1

인터페이스를 통해 쿼리 문자열/HTTP 양식에 대한 종속성을 바인딩하는 것이 좋습니다. 이 접근법은 의존성 주입 패턴 (특정 구현 및 클래스의 분리 코드)과 일치하는 것처럼 보입니다.

public interface IParameters 
{ 
    string SomeID { get; } 
} 

public class ParametersFromHttpContext 
{ 
    IQueryString _queryString; 
    IRequestForm _requestForm; 

    public ParametersFromHttpContext(IQueryString queryString, IRequestForm requestForm) 
    { 
     _queryString = queryString; 
     _requestForm = requestForm; 
    } 

    public string SomeID 
    { 
     get 
     { 
      return 
       // Try to get it from the posted form values 
       _requestForm["someID"] != null ? 
       long.Parse(_requestForm["someID"]) :           

       // Try to get it from the query string 
       _queryString["someID"] != null ? 
       long.Parse(_queryString["someID"]) 

       : 0; 
     } 
    } 
} 

커널의 HttpContext를 참조 할 필요없이 원하는 논리를 바인딩에 포함 할 수 있습니다.

kernel.Bind<IParameters>().To<ParametersFromHttpContext>(); 
+0

'ParametersFromHttpContext'는'IParameters'를 구현하지 않아야합니까? – Sung