2017-03-14 8 views
1

最近Web APIテンプレートを使用してサンプルアプリケーションを作成しました。私はまた、MicrosoftユニティMVCパッケージをインストールし、次のような試験サービスを追加します。コントローラーにパラメーターのないパブリックコンストラクターがあることを確認してください。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(); 
    } 

そしてUnityConfig:

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>(); 
    } 
} 

マイクロソフトユニティ私はテストAを実行したら、ホームコントローラの私のサービスを解決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!"); 
      } 
     }); 
    }) 
}); 

私は値のコントローラへのajax呼び出しを実行するためにボタンをクリックします。私は以下のエラーを受け取り、パラメータが少ないコンストラクタがないためコントローラを起動できません。

エラー:

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

通常、それを初期化するとき、フレームワークは、コントローラの依存関係を解決することができないことを示す共通の役に立たないエラー・メッセージです。

この場合、Web API用にDependencyResolverを設定する必要があります。 MVCとWeb APIの両方に依存関係リゾルバがありますが、それらは異なる名前空間に属しています。コメントで既に述べたように、Web 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 
    } 
} 
関連する問題