使用Web API 2.2进行Autofac

时间:2015-07-05 04:52:50

标签: asp.net-web-api autofac

global.asax.cs中的简单测试注册:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        //AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        //This allows interfaces etc to be provided as parameters to action methods
        ModelBinders.Binders.DefaultBinder = new DiModelBinder();

        //Now call the method to initialise anything that is required before startup (which includes setting up DI)
        WebUiInitialise.InitialiseThis(this);


        var builder = new Autofac.ContainerBuilder();
        builder.RegisterApiControllers(System.Reflection.Assembly.GetExecutingAssembly());
        builder.RegisterModule(new ServiceLayer.Startup.ServiceLayerModule());

        var container = builder.Build();
        System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
    }
}

测试apicontroller:

public class TestController : ApiController
{
    public TestController(IListService service)
    {
    }
    [HttpGet]
    public IQueryable<AspNetUser> Users(IListService service)
    {
        return null;
        //return service.GetAll<AspNetUser>();
    }
}

调试到TestController构造函数时,IListService服务有一个值,但在调试Users HttpGet方法时,它是null。

有没有办法解决Web Api控制器的依赖关系(IListService服务),get方法和post方法,而不仅仅是构造函数?

对于MVC控制器,方法解决,而不仅仅是构造函数。

1 个答案:

答案 0 :(得分:1)

如果您希望Autofac向Web API控制器注入某些内容,则它必须是构造函数参数或公共可设置属性。

即使在MVC中,默认情况下,Autofac也不会填充控制器操作参数。如果您还将特殊的Autofac动作调用者注册到管道中,它还有一定的能力,但同样,这不是默认行为的一部分 - 它是选择加入的。

Web API集成中不存在该动作调用程序支持。对于Web API,您需要使用标准的IoC实践。