9

我已经将 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.

在我看来,这似乎是通过 autofac 进行 DI 的问题。我是否遗漏了某些东西,或者有什么东西在进行中。我知道,MVC4 刚刚问世并且是一个测试版,所以我不期待太多,但我想我可能会遗漏一些东西。

4

2 回答 2

10

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

MVC 4

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

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

网络 API

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

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

链接现已修复。

于 2012-03-09T05:55:00.223 回答
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();

    //...
}

我希望这有帮助。

于 2012-02-27T08:38:21.687 回答