繁体   English   中英

ASP.Net MVC 4 Web API 控制器不适用于 Unity.WebApi

[英]ASP.Net MVC 4 Web API controller doesn't work with Unity.WebApi

我的 ASP.Net MVC 4 Web API 控制器不适用于 Unity.WebApi。 在同一个项目中,简单的控制器与 Unity.Mvc3 一起正常工作。 但是当我运行从 ApiController 派生的 Web API 控制器时,我收到一条消息:

{"$id":"1","Message":"发生错误。","ExceptionMessage":"Type 'ElectricTests.Controllers.Api.DocumentsController' 没有默认构造函数","ExceptionType":" System.ArgumentException","StackTrace":" 在 System.Linq.Expressions.Expression.New(Type type)\\r\\n 在 System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\\r\\n n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\\r\\n 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType )"}

我的 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;
    }
}

我的错误在哪里?

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。

当您为 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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM