【发布时间】:2017-03-14 18:15:48
【问题描述】:
我最近使用 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" };
}
这也是我调用 Values 控制器的 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 调用,我收到以下错误,似乎控制器无法启动,因为没有参数少的构造函数。
错误:
尝试创建类型控制器时出错 '值控制器'。确保控制器具有无参数 公共构造函数。
【问题讨论】:
-
你在WebApiConfig.cs中的HttpConfiguration.DependencyResolver中添加了unity容器了吗?
-
我认为UnityWebActivator类中的这行代码应该足够了。 DependencyResolver.SetResolver(new UnityDependencyResolver(container));
标签: c# asp.net-web-api unity-container ioc-container