问题 基础控制器类的属性注入


我正在尝试在任何源自我的控制器上自动设置属性 BaseController 类。这是我的代码 Application_Start 方法。该 UnitOfWork 当我尝试访问它时,property始终为null。

var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterType<VesteraTechnologiesContext>().As<IContext>();
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>();
builder.RegisterType<BaseController>()
       .OnActivated(c => c.Instance.UnitOfWork = c.Context.Resolve<IUnitOfWork>());
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

这是BaseController的样子

public class BaseController : Controller
{
    public IUnitOfWork UnitOfWork { get; set; }
}

我试图通过一个属性而不是通过构造函数来做这个的原因是我不必在每个需要访问的控制器中复制构造函数 UnitOfWork 属性,因为构造函数不是继承的。


2268
2017-10-16 18:09


起源



答案:


默认情况下,Autofac会将控制器注册为使用构造函数注入。启用 属性注入autofac:你应该使用:

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

14
2017-10-16 18:28



谢谢nemesv,这非常有效。 - Dylan Vester
@nemesv感谢您的提示。你知道吗,如果这有任何影响吗? - tugberk
@tugberk我没有在生产环境中使用过PropertiesAutowired,所以我不知道它有多大的性能影响。它使用反射来查找公共可设置属性,因此它至少具有通常的反射成本。 - nemesv
@nemesv新链接请 - Trikaldarshi
@Trikaldarshi感谢您的注意,我已经更新了链接。 - nemesv


答案:


默认情况下,Autofac会将控制器注册为使用构造函数注入。启用 属性注入autofac:你应该使用:

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

14
2017-10-16 18:28



谢谢nemesv,这非常有效。 - Dylan Vester
@nemesv感谢您的提示。你知道吗,如果这有任何影响吗? - tugberk
@tugberk我没有在生产环境中使用过PropertiesAutowired,所以我不知道它有多大的性能影响。它使用反射来查找公共可设置属性,因此它至少具有通常的反射成本。 - nemesv
@nemesv新链接请 - Trikaldarshi
@Trikaldarshi感谢您的注意,我已经更新了链接。 - nemesv


因为构造函数不是继承的。

通常,可以按如下方式调用基础构造函数:

public DescendantClass ()
  : base() 
{
}

-1
2017-10-16 18:24



OP需要一个带有的构造函数 IUnitOfWork 参数。 - Gert Arnold
GertArnold是正确的,我知道我可以级联构造函数,但这是我想要避免的。谢谢。 - Dylan Vester
像这样的公共构造函数什么都不做,除非还想为具有非默认构造函数的对象提供“默认构造函数”。隐式“默认构造函数”将自动调用基础构造函数。 - user2246674