【问题标题】:Property Injection for Base Controller Class基本控制器类的属性注入
【发布时间】:2017-04-12 16:52:39
【问题描述】:

我正在尝试在派生自我的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 属性的控制器中复制构造函数,因为构造函数不是继承的.

【问题讨论】:

    标签: c# asp.net-mvc inversion-of-control autofac


    【解决方案1】:

    Autofac 默认注册控制器以使用构造函数注入。要启用property injection with autofac:您应该使用:

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

    【讨论】:

    • @nemesv 感谢您的提示。你知道这是否会对性能产生影响吗?
    • @tugberk 我没有在生产环境中使用 PropertiesAutowired,所以我不知道它对性能的影响有多大。它使用反射来查找公共可设置属性,因此它至少具有通常的反射成本。
    • @nemesv 请新链接
    • @Trikaldarshi 感谢您的关注,我已经更新了链接。
    • @nemesv:我有一个基本控制器,我有一个要注入的属性,这对我没有帮助。
    【解决方案2】:

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

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

    public DescendantClass ()
      : base() 
    {
    }
    

    【讨论】:

    • OP 需要一个带有IUnitOfWork 参数的构造函数。
    • GertArnold 是正确的,我知道我可以级联构造函数,但这是我试图避免的。谢谢。
    • 拥有一个像这样的公共构造函数什么都不做,除非还想为具有非默认构造函数的对象提供“默认构造函数”。隐式“默认构造函数”会自动调用基本构造函数。
    猜你喜欢
    • 2014-12-31
    • 1970-01-01
    • 2011-03-10
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多