2013-05-06 2 views
1

나는이처럼 보이는 ApiController에 방법이있다.Asp.Net 웹 API - 매개 변수 바인딩/서식 지정을위한 특성이 없습니까?</p> <pre><code>public IEnumerable<Items> GetSlideSets() { IServiceClass serviceClass = new ServiceClass(); //... </code></pre> <p>예, 나는 이것이 좋은 디자인이 아니라 내가 다른 반복에서이 문제를 해결하고있어 것을 알고 :

내 응용 프로그램의 특정 시점에서 프로젝트 내에서이 기능을 호출해야하므로 컨트롤러를 재사용 할 수 있다고 생각했습니다. 왜 IoC 컨테이너에서 컨트롤러를 제거 할 수 있습니까?

public IEnumerable<Items> GetSlideSets(IServiceClass serviceClass = null) { 
     serviceClass = serviceClass ?? new ServiceClass(); 
     //... 

을 지금은 무엇입니까 오류를 제외하고 일반 API 호출 Optionalparameter 'serviceClass' is not supported by FormatterParameterBinding를 통해이를 호출 할 때 : 유일한 문제는이 경우에, 나는 IServiceClass 충분히 쉽게 내 자신의 구현을 주입 할 필요가 있다는 것입니다.

바인딩을 제어하는 ​​다양한 속성이 있다는 것을 알고 있습니다. 바인딩해서는 안되는 매개 변수를 넣을 수 있습니까?

+0

당신이 컨트롤러의 범위 대신의 작용 방식에'serviceClass'를 이동할 수 : 당신은 그냥 나중에 매개 변수에 속성을 적용 할 필요가

public class DontBindAttribute : ParameterBindingAttribute { public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter) { return new DontBindParameterBinding(parameter); } private class DontBindParameterBinding : HttpParameterBinding { public DontBindParameterBinding(HttpParameterDescriptor parameter) : base(parameter) { } public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken) { actionContext.ActionArguments.Add(Descriptor.ParameterName, Descriptor.DefaultValue); var completedTaskSource = new TaskCompletionSource<object>(); completedTaskSource.SetResult(null); return completedTaskSource.Task; } } } 

: 여기 것처럼 볼 수 있었다 무엇 네가 지금 가지고있는 범위? –

+0

IoC는 일반적으로 개체 생성시 발생하므로 IServiceClass 매개 변수는 메서드 매개 변수가 아닌 생성자 매개 변수 (개인 인스턴스 필드에 복사하여 거기에서 사용) 여야합니다. 그가 말한 것. – ChrisF

+0

그러면 ServiceClass가 모든 컨트롤러 메서드 호출에 대해 초기화됩니다. 더 나은 아키텍처에서는 이것이 문제가되지 않지만, 이것은 프로토 타입이 살아 있고 라우팅과 컨트롤러 리팩토링 같은 것들이 또 다른 반복을위한 것입니다. @ChrisF - 네가 맞아,이 부분은 IOC가 아니라 그냥 규칙적인 DI이다. 매개 변수를 통해 의존성을 주입하고있다. 비슷한 결과를 얻을 수있는 속성을 통해 주입 할 수도 있지만 속성을 구체적으로 찾고 있습니다. –

답변

2

다른 사람들과 마찬가지로, 생성자에 종속성을 삽입하는 것이 좋습니다.

그러나 실제로 액션 매개 변수를 바인딩하지 않아야하는 경우에는 기본 제공 속성이 없지만 매우 쉽게 만들 수 있습니다.

public IEnumerable<Items> GetSlideSets([DontBind] IServiceClass serviceClass = null) 
+0

고마워, 나는'게으른 <>'을 만들고이 경우 속성 주입을 사용하는 것으로 끝났지 만, 어떻게하는지 보여주는 것에 대해 고마워. –