最近Web APIテンプレートを使用してサンプルアプリケーションを作成しました。私はまた、MicrosoftユニティMVCパッケージをインストールし、次のような試験サービスを追加します。コントローラーにパラメーターのないパブリックコンストラクターがあることを確認してください。Microsoft Unityはパラメーターを解決できません。
public interface IUtilityService
{
string GetToken(int length);
}
public class UtilityService : IUtilityService
{
public string GetToken(int length)
{
return "ABC";
}
}
UnityConfig
とUnityWebActivator
だけでパッケージをインストールすることによって作成されたと私はちょうど、次のようにして自分のサービスを登録されています
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.
WebApiConfig.csのHttpConfiguration.DependencyResolverにユニティコンテナを追加しましたか? –
私はUnityWebActivatorクラスのこのコード行が十分だと思います。 DependencyResolver.SetResolver(新しいUnityDependencyResolver(コンテナ)); – ali