Autofac - 将属性注入到asp.net mvc控制器中

时间:2011-05-05 08:00:18

标签: asp.net-mvc autofac

我有一个基本控制器,从中继承我的所有控制器。这个基本控制器有一些我想要注入using属性注入的属性。

我的控制器注册看起来像这样

builder.RegisterControllers(Assembly.GetExecutingAssembly()

我不知道如何访问基类并注入属性。

5 个答案:

答案 0 :(得分:8)

这应该有效:

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

autofac网站上的更多信息:http://code.google.com/p/autofac/wiki/PropertyInjection

答案 1 :(得分:5)

您可能需要考虑使用Autofac Aggregate Service

  

当您需要将一组依赖项视为一个依赖项时,聚合服务很有用。当一个类依赖于几个构造函数注入的服务,或者有几个注入属性的服务时,将这些服务移动到一个单独的类中会产生一个更简单的API。

     

一个例子是超类和子类,其中超类具有一个或多个构造函数注入的依赖项。子类通常必须继承这些依赖项,即使它们可能只对超类有用。使用聚合服务,可以将超类构造函数参数折叠为一个参数,从而减少子类中的重复性。另一个重要的副作用是子类现在与超类依赖项的更改隔离,在超类中引入新的依赖项意味着只更改聚合服务定义。

答案 2 :(得分:3)

这对我有用:

using Autofac;
using Autofac.Integration.Web;
using Autofac.Integration.Web.Mvc;    

builder.RegisterType<ExtensibleActionInvoker>().As<IActionInvoker>();
builder.RegisterControllers(Assembly.GetExecutingAssembly()).InjectActionInvoker();

答案 3 :(得分:2)

nickvane的回答是正确的。只需确保

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

是在注册所有依赖项之后。或者换言之,就在您构建容器之前。

所以最终代码看起来像

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

var container = builder.Build();

答案 4 :(得分:1)

还需要调用MVC:

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

对于Web API:

HttpConfiguration config = GlobalConfiguration.Configuration;
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);