10

ASP.Net MVC 4 Web API コントローラーが Unity.WebApi で動作しません。同じプロジェクトで、単純なコントローラーは Unity.Mvc3 で適切に動作します。しかし、ApiController から派生した Web API コントローラーを実行すると、次のメッセージが表示されます。

{"$id":"1","Message":"エラーが発生しました。","ExceptionMessage":"タイプ 'ElectricTests.Controllers.Api.DocumentsController' にはデフォルトのコンストラクターがありません","ExceptionType":" System.ArgumentException","StackTrace":" System.Linq.Expressions.Expression.New(Type タイプ) で\r\n System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType) で\r\ 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;
    }
}

私の間違いはどこですか?

4

2 に答える 2

0

Unity for ASP.NET Web API をインストールすると、次の行を 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);
}
于 2013-06-07T15:45:19.517 に答える