2017-03-14 1 views
1

최근에 Web API 템플릿을 사용하여 샘플 응용 프로그램을 만듭니다.컨트롤러에 매개 변수없는 public 생성자가 있는지 확인하십시오. Microsoft Unity에서 매개 변수를 확인할 수 없습니다.

public interface IUtilityService 
{ 
    string GetToken(int length); 
} 

public class UtilityService : IUtilityService 
{ 
    public string GetToken(int length) 
    { 
     return "ABC"; 
    } 
} 

UnityConfigUnityWebActivator 그냥 패키지를 설치하여 만들어지고 난 그냥 다음과 같이 내 자신의 서비스를 등록 :

public static class UnityWebActivator 
{ 
    /// <summary>Integrates Unity when the application starts.</summary> 
    public static void Start() 
    { 
     var container = UnityConfig.GetConfiguredContainer(); 

     FilterProviders.Providers.Remove(
      FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First()); 
     FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container)); 

     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

     // TODO: Uncomment if you want to use PerRequestLifetimeManager 
     // Microsoft.Web.Infrastructure.DynamicModuleHelper 
     // .DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule)); 
    } 

    /// <summary>Disposes the Unity container when the application is shut down.</summary> 
    public static void Shutdown() 
    { 
     var container = UnityConfig.GetConfiguredContainer(); 
     container.Dispose(); 
    } 
다음으로 나는 또한 마이크로 소프트 유니티 MVC 패키지를 설치 및 테스트 서비스를 추가

그리고 UnityConfig : 나는 시험 a를 실행하면

public class UnityConfig 
{ 
    #region Unity Container 
    private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() => 
    { 
     var container = new UnityContainer(); 
     RegisterTypes(container); 
     return container; 
    }); 

    public static IUnityContainer GetConfiguredContainer() 
    { 
     return container.Value; 
    } 
    #endregion 

    public static void RegisterTypes(IUnityContainer container) 
    { 
     // NOTE: To load from web.config uncomment the line below. Make sure to 
     // add a Microsoft.Practices.Unity.Configuration to the using statements. 
     // container.LoadConfiguration(); 

     // TODO: Register your types here 
     container.RegisterType<IUtilityService, UtilityService>(); 
    } 
} 

마이크로 소프트 유니티 홈 컨트롤러에서 내 서비스를 해결 pplication 그러나 JQuery에서 Values ​​컨트롤러 내부의 메서드를 호출하면 서비스를 확인할 수 없습니다.

코드

은 다음과 같습니다 :

private readonly IUtilityService utilityService; 

public HomeController(IUtilityService utilityService) 
{ 
    this.utilityService = utilityService; 
} 

public ActionResult Index() 
{ 
    ViewBag.Title = utilityService.GetToken(10); 

    return View(); 
} 

을 그리고 값 컨트롤러는 다음과 같다 :

private readonly IUtilityService utilityService; 

public ValuesController(IUtilityService utilityService) 
{ 
    this.utilityService = utilityService; 
} 

// GET api/values 
public IEnumerable<string> Get() 
{ 
    return new string[] { "value1", "value2" }; 
} 

이것은 또한 내가 값 컨트롤러 호출하는 jQuery 코드입니다 :

$(document).ready(function() { 
    console.log("ready!"); 

    $('#call').click(function() { 
     $.ajax({ 
      type: "GET", 
      dataType: 'json', 
      url: "api/Values", 
      success: function (response) { 
       console.log("success!"); 
      }, 
      error: function (response, textStatus, errorThrown) { 
       console.log("error!"); 
      } 
     }); 
    }) 
}); 
에게

하나 내가 값을 컨트롤러에 아약스 호출을 실행하려면 버튼을 클릭하십시오 나는 아래 오류가 나타납니다 매개 변수가 적은 생성자가 없기 때문에 컨트롤러를 시작할 수 없습니다.

오류 :

보통을 초기화 할 때 프레임 워크는 컨트롤러의 종속성을 해결할 수 없음을 나타냅니다 공통 도움이되지 않는 오류 메시지입니다

An error occurred when trying to create a controller of type 'ValuesController'. Make sure that the controller has a parameterless public constructor.

+1

WebApiConfig.cs의 HttpConfiguration.DependencyResolver에 유니티 컨테이너를 추가 했습니까? –

+0

UnityWebActivator 클래스에서이 코드 줄이 충분하다고 생각합니다. DependencyResolver.SetResolver (새로운 UnityDependencyResolver (컨테이너)); – ali

답변

1

.

이 경우 웹 API 용으로 DependencyResolver을 설정해야합니다. MVC와 Web API는 모두 의존성 해결자를 가지고 있지만 서로 다른 네임 스페이스에 속합니다. 의견에서 이미 언급했듯이 웹 API 구성시 HttpConfiguration의 종속성 해결 프로그램을 설정해야합니다.

public static class WebApiConfig { 

    public static void Register(HttpConfiguration config) { 

     var container = UnityConfig.GetConfiguredContainer(); 

     //...any other settings to be applied to container. 

     config.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container); 

     //...other code removed for brevity 
    } 
} 
관련 문제