ASP.Net MVC 4 Web API 控制器不适用于 Unity.WebApi
Posted
技术标签:
【中文标题】ASP.Net MVC 4 Web API 控制器不适用于 Unity.WebApi【英文标题】:ASP.Net MVC 4 Web API controller doesn't work with Unity.WebApi 【发布时间】:2013-04-14 08:18:30 【问题描述】:我的 。在同一个项目中,简单的控制器可以正常使用 Unity.Mvc3。但是当我运行从 ApiController 派生的 Web API 控制器时,我收到一条消息:
"$id":"1","Message":"发生错误。","ExceptionMessage":"类型 'ElectricTests.Controllers.Api.DocumentsController' 没有 默认 构造函数","ExceptionType":"System.ArgumentException","StackTrace":" 在 System.Linq.Expressions.Expression.New(类型类型)\r\n 在 System.Web.Http.Internal.TypeActivator.Create[TBase](类型 instanceType)\r\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage 请求,类型 controllerType,Func`1& 激活器)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor 控制器描述符,类型 控制器类型)"
我的 ApiController:
public class DocumentsController : ApiController
private readonly IDocumentsRepository _repository;
public DocumentsController(IDocumentsRepository repository)
_repository = repository;
public IEnumerable<FormattedDocument> GetFormattedDocuments()
return _repository.GetAllFormattedDocuments();
...
Bootstrapper.cs:
public static class Bootstrapper
public static void Initialise()
IUnityContainer container = BuildUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
private static IUnityContainer BuildUnityContainer()
var container = new UnityContainer();
// register all your components with the container here
// it is NOT necessary to register your controllers
// e.g. container.RegisterType<ITestService, TestService>();
container.RegisterType<IDocumentsRepository, DocumentsRepository>();
container.RegisterType<IQuestionsRepository, QuestionsRepository>();
container.RegisterType<ITestRepository, TestsRepository>();
return container;
我的错误在哪里?
【问题讨论】:
异常文本:DocumentsController 没有默认构造函数 这篇文章解决了这个问题:asp.net/web-api/overview/extensibility/… 【参考方案1】:Controller 和 ApiController 的处理方式不同,因为它们具有完全不同的基类:
我使用 Unity.MVC4 库作为控制器 DI (http://www.nuget.org/packages/Unity.MVC4/)
Install-Package Unity.MVC4
和用于 DI 的 Unity.WebAPI (http://www.nuget.org/packages/Unity.WebAPI/)
Install-Package Unity.WebAPI
您的引导程序应该是两者的组合:
DependencyResolver.SetResolver(new Unity.Mvc4.UnityDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);
请注意,我还必须添加一些注册才能使帮助页面正常工作
container.RegisterInstance(typeof (HttpConfiguration), GlobalConfiguration.Configuration);
作为 Unity.MVC4 的所有者,我正在考虑在我们的库中实现 WebApi。
【讨论】:
这个答案解决了我使用 Unity 和 WebApi 控制器的问题,感谢@Oliver。【参考方案2】:当您为 ASP.NET Web API 安装 Unity 时,它会执行所有操作,除了将以下行添加到您的 Global.asax
Bootstrapper.Initialise();
所以你需要将它添加到你的 Application_Start 方法中:
protected void Application_Start()
AreaRegistration.RegisterAllAreas();
Bootstrapper.Initialise();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
【讨论】:
以上是关于ASP.Net MVC 4 Web API 控制器不适用于 Unity.WebApi的主要内容,如果未能解决你的问题,请参考以下文章
ASP.Net MVC 4 Web API 控制器不适用于 Unity.WebApi
ASP.NET MVC 4 / MVVM / Web API 的良好结构? [关闭]
使用成员资格提供程序的 ASP.NET MVC 4 Web API 身份验证
ASP.NET Web API将MV响应转换为MVC 4中的json List