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

Asp.net mvc Autofac-将属性注入asp.net mvc控制器,asp.net-mvc,autofac,Asp.net Mvc,Autofac,我有一个基本控制器,从中继承我的所有控制器。这个基本控制器有一些属性,我想使用属性注入注入 我的控制器注册看起来像这样 builder.RegisterControllers(Assembly.GetExecutingAssembly() 我不知道如何访问基类并注入属性。 您可能需要考虑使用A: 当您需要将一组依赖项视为一个依赖项时,聚合服务非常有用。当一个类依赖于几个构造函数注入的服务,或者有几个属性注入的服务时,将这些服务移动到一个单独的类中会产生一个更简单的API 一个例子是超类和子类,

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

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

builder.RegisterControllers(Assembly.GetExecutingAssembly()

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

您可能需要考虑使用A:

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

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

这对我很有用:

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

builder.RegisterType<ExtensibleActionInvoker>().As<IActionInvoker>();
builder.RegisterControllers(Assembly.GetExecutingAssembly()).InjectActionInvoker();
使用Autofac;
使用Autofac.Integration.Web;
使用Autofac.Integration.Web.Mvc;
builder.RegisterType().As();
RegisterController(Assembly.GetExecutionGassembly()).InjectActionInvoker();
这应该可以:

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

有关autofac网站的更多信息:

也需要致电MVC:

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
对于Web API:

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

尼克瓦内的回答是正确的。只要确定一下

builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired();
是在注册所有依赖项之后。或者换句话说,就在您构建容器之前

所以最终的代码看起来像

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

var container = builder.Build();

最好使用构造函数注入,并且只有在确实需要时才使用属性注入。当然,使用Autofac是完全可能的(我自己也必须使用它)。我这里没有代码,但如果没有其他人有,我会稍后发布。我现在使用构造函数注入,但有3个依赖项必须传递给基类,我不希望我必须在我创建的每个控制器中重复这一点。是的,这与我面临的情况相同。@user256034-你有多少个控制器,20个,30个?那没什么大不了的。属性注入打开了很多场景,其中组件的状态可以在运行时更改。这真的很糟糕。@user256034:是的,但我认为他的意思是,通常通过构造函数注入,您正在初始化一个只读私有成员,而属性是可变的,可以意外更改。1)您是否已向Autofac注册了接口/具体类型?2) 你想注入公众的财产?很奇怪。类型已注册(在ctor中被注入),并且porperties也是公共的,但它仍然不起作用。关于如何连接ActionFilter属性注入的最新信息可以在这里找到:对于我来说,我发现了一个阻止属性注入的bug。它似乎对全局ActionFilters不起作用。这帮了大忙。这让我意识到,通过这样做,您可以根据已注册的类型将控制器设置为自动设置控制器属性。我之前在尝试注入的类型上设置了
属性autowired