我最近使用Web API模板创建了一个示例应用程序。我还安装了Microsoft Unity Mvc软件包并添加了一个测试服务,如下所示:
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>();
}
}
一旦我运行测试应用程序,Microsoft Unity就会在Home控制器中解析我的服务,但是,一旦我想从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调用值控制器我得到下面的错误,似乎控制器无法启动,因为没有参数较少的构造函数。
错误:
尝试创建类型的控制器时发生错误 'ValuesController'。确保控制器具有无参数 公共建设者。
答案 0 :(得分: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
}
}