AutoFac MVC Web API [英] AutoFac MVC Web API

查看:66
本文介绍了AutoFac MVC Web API的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个简单的AutoFac示例,但现在要将其应用到我的Web api项目中,并在各层之间进行正确的分隔.

I have a simple AutoFac example working but now want to apply this to my web api project AND have the correct separation between the layers.

我看到的问题是标准控制器x没有默认构造函数",但我很困惑,因此寻求建议.

The issue I am seeing is the standard controller x "does not have a default constructor" but i am stumped so asking for advice..

我正在调用RegisterApiControllers以及RegisterControllers.

I am calling RegisterApiControllers as well as RegisterControllers..

这就是我的DependencyInjectionContainer中的

this is what I have in my DependencyInjectionContainer

public static class DependencyInjectionContainer
{
    public static ContainerBuilder Builder;
    public static IContainer Container;

    public static void Init(Assembly mainAssembly)
    {
        Builder = new ContainerBuilder();
        var config = GlobalConfiguration.Configuration;

        RegisterTypes(mainAssembly);

        Container = Builder.Build();

        config.DependencyResolver = new AutofacWebApiDependencyResolver(Container);
        DependencyResolver.SetResolver(new AutofacDependencyResolver(Container));
    }

    private static void RegisterTypes(Assembly mainAssembly)
    {
        var roomBookingConnectionString = ConfigurationManager.ConnectionStrings["RoomBooking"].ConnectionString;

        Builder.RegisterControllers(mainAssembly);

        Builder.RegisterType<RoomRepository>().As<IRoomRepository>().WithParameter(new TypedParameter(typeof(string), roomBookingConnectionString));
        Builder.RegisterType<RoomService>().As<IRoomService>();

        Builder.RegisterApiControllers(mainAssembly);

        Builder.RegisterFilterProvider();
    }
}

我在Global.asax.cs中称呼这个

I am calling this in my Global.asax.cs

DependencyInjectionContainer.Init(typeof(MvcApplication).Assembly);

这里的一个大假设是,这是正确的...

One big assumption here is that this is correct...

Builder.RegisterApiControllers(mainAssembly);

edit ---------------------------------------------- -----------------------

edit---------------------------------------------------------------------

我刚刚尝试将上述2种方法中的所有DI注册等移回global.asax.cs,并且可以使用!?!?

I have just tried moving all of the DI registrations etc in the 2 methods above back to the global.asax.cs and it works!?!?

我认为这与'RegisterApiControllers'有关.我正在使用'typeof(MvcApplication).Assembly'将调用程序集传递到上述init方法中.这有什么问题吗?

I think its something to do with the 'RegisterApiControllers'. I am passing the calling assembly into the above init method using 'typeof(MvcApplication).Assembly'. Is there something wrong with this?

谢谢.

推荐答案

Autofac使用RegisterApiControllers方法来定位控制器.

The RegisterApiControllers method is used by Autofac to locate the controllers.

当您执行Builder.RegisterApiControllers(mainAssembly);时,确定mainAssembly参数是包含控制器的程序集吗?

When you do Builder.RegisterApiControllers(mainAssembly); are you sure the mainAssembly parameter is the assembly containing the controllers?

无论如何,如果您遇到此类问题,则可以执行以下操作(猜测您有一个名为 RoomBookingController 的控制器):

Anyway, if you have this kind of problems, you can do something like this (guessing you have a controller called RoomBookingController) :

builder.RegisterApiControllers(typeof(RoomBookingController).Assembly);

通过这种方式,Autofac可以找到包含控制器的程序集,无论它在哪里.

This way Autofac will locate the assembly containing your controller, no matter where it is.

这篇关于AutoFac MVC Web API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆