0

ASP.NET WebAPI로 REST API를 작성합니다. 모든 것이 잘 작동했지만, 모든 메소드 호출에서 인터페이스를 사용하는 것이 좋습니다. 모든 메소드를 변경 한 후에 컨트롤러 메소드의 매개 변수를 인터페이스로 설정 한 후에 API 호출이 작동하지 않는다는 것을 알아 차렸습니다. 저는 OWIN 자체 호스트와 Unity 의존성 주입을 사용하고 있습니다.API 호출의 매개 변수로 REST WebAPI 인터페이스

 IUnityContainer container = new UnityContainer(); 

     container.RegisterType<IMyInterface, MyInterfaceImpl>(new HierarchicalLifetimeManager()); 
     HttpConfiguration config = new HttpConfiguration(); 
     config.DependencyResolver = new UnityDependencyResolver(container); 

내 컨트롤러 (내가 오류가 발생하는 부분)이 메소드를 호출 할 때

[Route("test")] 
    [HttpGet] 
    public HttpResponseMessage GetSomeData([FromUri]IMyInterface searchObject) 
    { 
     return this._searchService.SearchForData(searchObject); 

    } 

내가 인터페이스는 그 오류를 얻을 : 내 인터페이스를 해결

: 여기 내 관련 코드 만들 수 없습니다. 나는 그것을 잘 모릅니다. 그러나 문제는 그것을 고치고 있습니다. 나는 ASP.NET Web API Operation with interfaces instead concrete class을 보았고 https://brettedotnet.wordpress.com/2014/07/16/web-api-and-interface-parameters/ASP.NET Web API Operation with interfaces instead concrete class을 보았지만 내 경우에는 효과가 없었습니다. 항상 인터페이스를 만들 수 없다는 오류가 발생했습니다.

사람이 (다른 GitHub의 나에) 이런 일에 작업 예제가있는 경우 난 그냥 내가 잘못 뭐하는 거지 확인 궁금

(또는 내가 좋은 것 시도 할 수 밖에 무엇도 생각)

감사 당신은

답변

1

쿼리 문자열에서 데이터를 전달하기 때문에 다른 접근 방법이 필요합니다. 내가 언급 한 블로그 게시물에 그 시나리오는 포함되지 않았습니다. 쿼리 링은 모델 바인더를 통해 처리되므로 사용자 정의 모델 바인더를 만들어야합니다.

내 경우에는 아래와 같이 IoCModelBinder를 만들기로 선택했습니다.

public class IocModelBinder : IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     var targetObject = ServiceLocator.Current.GetInstance(bindingContext.ModelType); 
     var valueProvider = GlobalConfiguration.Configuration.Services.GetValueProviderFactories().First(item => item is QueryStringValueProviderFactory).GetValueProvider(actionContext); 

     foreach (var property in targetObject.GetType().GetProperties()) 
     { 
      var valueAsString = valueProvider.GetValue(property.Name); 
      var value = valueAsString == null ? null : valueAsString.ConvertTo(property.PropertyType); 

      if (value == null) 
       continue; 

      property.SetValue(targetObject, value, null); 
     } 

     bindingContext.Model = targetObject; 
     return true; 
    } 
} 

그리고 희망이 도움이

/// <summary> 
    /// Searches by the criteria specified. 
    /// </summary> 
    /// <param name="searchCriteriaDto">The search criteria dto.</param> 
    /// <returns></returns> 
    [HttpGet] 
    public HttpResponseMessage Search([ModelBinder(typeof(IocModelBinder))]IApplicationSearchCriteriaDto searchCriteriaDto) 
    { 

    } 

사용

.

브렛테

+0

자기 호스트에 Owin을 사용하고 있으므로 GlobalConfiguration이 없습니다. 내가 가진 모든 것은 HttpConfiguration이지만 그것을 사용할 때 System.Web.Http.Controllers.ServicesContainer를 인수로 사용하는 HttpConfiguration에 GetValueProviderFactories 메서드가 없다는 오류가 발생합니다. – user3466562

관련 문제