我一直在使用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刚出来并且是一个测试版,所以我没想到太多,但我觉得我可能会遗漏一些东西。
答案 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();
//...
}
我希望这会有所帮助。