Autofac和ASP.NET Web API ApiController

9

我已经使用autofac和MVC3有一段时间了,非常喜欢它。最近我把一个项目升级到了MVC4,除了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.

我认为这是通过autofac进行DI的问题。我有什么遗漏还是有什么正在进行中的工作?我知道,MVC4刚刚发布并且还处于beta版本,所以我不指望太多,但我想我可能会遗漏些什么。

2个回答

10
我已经在NuGet上发布了与MVC 4和Web API的Beta版本集成的Autofac包。这些集成将为每个控制器请求(根据集成,可能是MVC控制器或API控制器)创建一个Autofac生命周期范围。这意味着控制器及其依赖项将在每次调用结束时自动处理。两个包可以在同一项目中并存。

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
很不幸,在撰写本评论时,似乎同时在MVC 4 RC和Web API RC中使用Autofac无法正常工作。我收到有关在Web API框架程序集中找不到类型的编译器警告。我不得不使用@tugberk提供的答案并重新实现依赖项解析器来解决这个问题。 - NathanAldenSr

4

我刚刚在我的一个应用程序上进行了配置。有不同的方法可以实现,但我喜欢这种方法:

Autofac和ASP.NET Web API System.Web.Http.Services.IDependencyResolver集成

首先,我创建了一个类,该类实现了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();

    //...
}

我希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接