2011-10-16 35 views
11

我试图自动设置属于我的BaseController类的任何控制器上的属性。这是我的Application_Start方法中的代码。当我尝试访问它时,UnitOfWork属性始终为空。基础控制器的属性注入类

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属性的控制器中,因为构造函数不会被继承。

回答

14

Autofac默认寄存器控制器使用构造器注入。要启用property injection with autofac:您应该使用:

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

谢谢你nemesv,这工作完美。 –

+0

@nemesv感谢您的提示。你知道吗,如果这有什么影响? – tugberk

+0

@tugberk我没有在生产环境中使用PropertiesAutowired,所以我不知道它有多少perf影响。它使用反射来查找公共可设置属性,因此它至少具有通常的反射成本。 – nemesv

-1

因为构造函数没有被继承。

通常,有可能调用基构造如下:

public DescendantClass() 
    : base() 
{ 
} 
+0

该OP将需要一个带'IUnitOfWork'参数的构造函数。 –

+0

GertArnold是正确的,我知道我可以级联构造函数,但这是我想要避免的。谢谢。 –

+0

有一个这样的公共构造函数什么都不做,除非也想为非默认构造函数提供一个“默认构造函数”。基础构造函数将自动由隐式“默认构造函数”调用。 – user2246674