【问题标题】:Autofac - Inject properties into a asp.net mvc controllerAutofac - 将属性注入 asp.net mvc 控制器
【发布时间】:2014-08-12 04:29:35
【问题描述】:

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

我的控制器注册如下所示

builder.RegisterControllers(Assembly.GetExecutingAssembly()

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

【问题讨论】:

  • 最好使用构造函数注入,真正需要的时候才使用属性注入。不过,Autofac 绝对有可能(我不得不自己使用它)。我这里没有代码,如果没有其他人会稍后发布。
  • 我现在使用构造函数注入,但是有 3 个依赖项必须传递给基类,我不喜欢在我创建的每个控制器中重复这一点。
  • 是的,这和我遇到的情况一样。
  • @user256034 - 你有多少个控制器,20 个、30 个?那没什么大不了的。属性注入打开了大量的场景,其中组件的状态可以在运行时改变。真的很糟糕。
  • @user256034:是的,但我认为他的意思是,通常通过构造函数注入,您正在初始化一个只读私有成员,而属性是可变的,并且可以意外更改。

标签: asp.net-mvc autofac


【解决方案1】:

这应该可行:

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

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

【讨论】:

  • 这很有帮助。它让我意识到,通过这样做,您将控制器设置为根据您注册的类型自动设置 THE CONTROLLER 属性。我之前在尝试注入的类型上设置了PropertiesAutowired
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    这对我有用:

    using Autofac;
    using Autofac.Integration.Web;
    using Autofac.Integration.Web.Mvc;    
    
    builder.RegisterType<ExtensibleActionInvoker>().As<IActionInvoker>();
    builder.RegisterControllers(Assembly.GetExecutingAssembly()).InjectActionInvoker();
    

    【讨论】:

    • 1) 您是否在 Autofac 中注册了 Interface/Concrete 类型? 2)你试图注入的财产是公开的吗?
    • 很奇怪。类型已注册(注入到 ctor 中),并且 porperties 是公开的,但它仍然不起作用。
    • 关于如何连接 ActionFilter 属性注入的最新信息可以在这里找到:alexmg.com/post/2011/03/24/…
    • 对我来说,我发现了一个阻止属性注入的错误。它似乎不适用于全局 ActionFilter。
    【解决方案4】:

    nickvane 的回答是正确的。只要确定

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

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

    所以最终的代码看起来像

    .
    .
    .
    builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired();           
    
    var container = builder.Build();
    

    【讨论】:

      【解决方案5】:

      还需要调用 MVC:

      DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
      

      对于 Web API:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多