我正在将 Autofac 与 MVC/Owin 和 WebApi 一起使用。
按照 Autofac 文档,我正在使用设置:
public static void Run(IAppBuilder application) {
ContainerBuilder builder = new ContainerBuilder();
HttpConfiguration configuration = GlobalConfiguration.Configuration;
builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterModelBinders(typeof(MvcApplication).Assembly);
builder.RegisterModelBinderProvider();
builder.RegisterModule<AutofacWebTypesModule>();
builder.RegisterSource(new ViewRegistrationSource());
builder.RegisterFilterProvider();
builder.RegisterApiControllers(typeof(MvcApplication).Assembly);
builder.RegisterWebApiFilterProvider(configuration);
builder.RegisterType<Test>().As<ITest>().PropertiesAutowired();
IContainer container = builder.Build();
application.UseAutofacMiddleware(container);
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}
然后我在 Controller 上测试了构造函数和属性注入(inject):
public interface ITest { }
public class Test : ITest { }
public partial class HomeController : Controller {
private ITest _testConstructor { get; set; }
public ITest TestProperty { get; set; }
public HomeController(ITest testConstructor) {
_testConstructor = testConstructor;
}
public virtual ActionResult Index() {
var test = TestProperty;
}
}
所以 _testConstructor 被注入(inject)并且 TestProperty 始终为空。
我什至在 Index 方法中检查了它的值,它是 null ...
我尝试了不同的配置,在应用程序的不同部分,属性注入(inject)总是失败......
有人可以帮我解决这个问题吗?
更新 1
添加 .PropertiesAutowired(); RegisterController 适用于 Controller ,但不适用于 ViewPages。
我正在使用 ViewPageBase 如下:
public abstract class ViewPageBase : WebViewPage {
public ITest Test { get; set; }
} // ViewPageBase
public abstract class ViewPageBase<T> : WebViewPage<T> {
public ITest Test { get; set; }
} // ViewPageBase
然后在 Autofac 设置中,我有:
builder.RegisterSource(new ViewRegistrationSource());
builder.RegisterType<Test>().As<ITest>();
builder.RegisterType<WebViewPage>().PropertiesAutowired();
builder.RegisterGeneric(typeof(WebViewPage<>)).PropertiesAutowired();
但是当我在 View 中访问 Test 属性时,它为空。
为什么?
更新 2
如果在我的布局 View 中添加:
@{
var test = DependencyResolver.Current.GetService<ITest>();
}
测试正确解决...
也许这是布局页面和 Autofac 的问题?
更新 3
我能够复制问题并在 https://github.com/mdmoura/MvcAutofac 中创建了一个项目
如果您运行该项目,在第二行代码的 _Layout 母版页上会出现错误:
@SettingsA.Get()
@SettingsB.Get()
SettingsA 在 ViewPagePage 中使用 DependencyResolver 进行解析,并且可以正常工作。
使用 SettingsB 我试图使用属性注入(inject)但没有运气。
Autofac 配置在 global.asax Application_Start 中。
有谁知道可能有什么问题?
最佳答案
Autofac 中不会自动完成属性注入(inject)。您必须告诉 Autofac 在您的 Controller 注册中注入(inject)属性。
builder.RegisterControllers(typeof(MvcApplication).Assembly)
.PropertiesAutowired();
有关 Autowiring 属性的更多信息,请参阅 Property and Method Injection。
关于c# - Autofac 的属性注入(inject)失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29535893/