Autofac和ASP.NET Web API ApiController

时间:2012-02-26 03:28:38

标签: autofac asp.net-mvc-4 asp.net-web-api

我一直在使用autofac和MVC 3并且喜欢它。我最近将一个项目升级到MVC 4,除了Web Api ApiControllers之外,一切似乎都在工作。我收到以下异常。

An error occurred when trying to create a controller of type 'MyNamespace.Foo.CustomApiController'. Make sure that the controller has a parameterless public constructor.

在我看来,这是DI via autofac的一个问题。我是否遗漏了某些东西,或者是否有某些东西在工作中我知道,MVC4刚出来并且是一个测试版,所以我没想到太多,但我觉得我可能会遗漏一些东西。

2 个答案:

答案 0 :(得分:10)

我已经在NuGet上发布了针对MVC 4和Web API的Beta版本的Autofac集成包。这些集成将为每个控制器请求创建一个Autofac生命周期范围(MVC控制器或API控制器,具体取决于集成)。这意味着控制器及其依赖项将在每次调用结束时自动处理。这两个软件包可以并排安装在同一个项目中。

MVC 4

https://nuget.org/packages/Autofac.Mvc4

http://alexmg.com/post/2012/03/09/Autofac-ASPNET-MVC-4-(Beta)-Integration.aspx

Web API

https://nuget.org/packages/Autofac.WebApi/

http://alexmg.com/post/2012/03/09/Autofac-ASPNET-Web-API-(Beta)-Integration.aspx

链接现已修复。

答案 1 :(得分:4)

我刚刚在我的某个应用上配置了此功能。有不同的方法,但我喜欢这种方法:

Autofac and ASP.NET Web API System.Web.Http.Services.IDependencyResolver Integration

首先,我创建了一个实现System.Web.Http.Services.IDependencyResolver接口的类。

internal class AutofacWebAPIDependencyResolver : System.Web.Http.Services.IDependencyResolver {

    private readonly IContainer _container;

    public AutofacWebAPIDependencyResolver(IContainer container) {

        _container = container;
    }

    public object GetService(Type serviceType) {

        return _container.IsRegistered(serviceType) ? _container.Resolve(serviceType) : null;
    }

    public IEnumerable<object> GetServices(Type serviceType) {

        Type enumerableServiceType = typeof(IEnumerable<>).MakeGenericType(serviceType);
        object instance = _container.Resolve(enumerableServiceType);
        return ((IEnumerable)instance).Cast<object>();
    }
}

我还有另一个班级来保存我的注册信息:

internal class AutofacWebAPI {

    public static void Initialize() {
        var builder = new ContainerBuilder();
        GlobalConfiguration.Configuration.ServiceResolver.SetResolver(
            new AutofacWebAPIDependencyResolver(RegisterServices(builder))
        );
    }

    private static IContainer RegisterServices(ContainerBuilder builder) {

        builder.RegisterAssemblyTypes(typeof(MvcApplication).Assembly).PropertiesAutowired();

        builder.RegisterType<WordRepository>().As<IWordRepository>();
        builder.RegisterType<MeaningRepository>().As<IMeaningRepository>();

        return
            builder.Build();
    }
}

然后,在Application_Start初始化它:

protected void Application_Start() {

    //...

    AutofacWebAPI.Initialize();

    //...
}

我希望这会有所帮助。