我一直在使用MVC3中的Autofac,并喜欢它.现在我试图用MVC4实现它.
我通过软件包管理器控制台(Install-Package Autofac.Mvc4 -Pre和Install-Package Autofac.WebApi -Pre)安装了Autofac MVC4和Autofac WebApi的预发行版本.
我调整了我的IoC容器如下:
private static void SetAutofacContainer() { var builder = new ContainerBuilder(); builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest().InstancePerApiRequest(); builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerHttpRequest().InstancePerApiRequest(); builder.RegisterType<RepositoryWrapper>().As<RepositoryWrapper>().InstancePerHttpRequest().InstancePerApiRequest(); builder.RegisterType<ServiceWrapper>().As<ServiceWrapper>().InstancePerHttpRequest().InstancePerApiRequest(); // Repositories builder.RegisterAssemblyTypes(typeof(UserRepository).Assembly).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerHttpRequest().InstancePerApiRequest(); // Services builder.RegisterAssemblyTypes(typeof(UserService).Assembly).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerHttpRequest().InstancePerApiRequest(); IContainer container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container); }
当我运行应用程序(通过访问API控制器)我得到例外:
“Controllers.UserController”没有默认构造函数“
控制器如下所示:
namespace Controllers { [Authorize] public class UserController : ApiController { private ServiceWrapper _services; public UserController(ServiceWrapper services) { _services = services; } // GET api/user/{userrequest} public IQueryable<User> Get(UserRequest request) { if (ModelState.IsValid) { '... } } }
我错过了什么吗?我没有设置好吗?任何帮助将不胜感激!
更新
我的API控制器位于同一解决方案的单独项目中.如果我将API控制器放在我的主要MVC项目中,它可以工作.有人可以告诉我如何让Autofac在我的API项目中注册API控制器?
解决方法
使用RegisterApiController方法,您可以告诉Autofac哪个(在哪个程序集中)它应该查找您的ApiControllers
所以下面来电:
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
从当前程序集(project)注册ApiController.
如果您在另一个项目中也有ApiControllers,则需要使用它:
builder.RegisterApiControllers(typeof(UserController).Assembly);
这意味着:将所有ApiController注册到UserController所在的程序集(project)中.因此,即使您在程序集(项目)中有多个ApiController,每个程序集只需要一个RegisterApiControllers.