属性 使用 Autofac 注入失败
Property Injection fails with Autofac
我将 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);
}
然后我在控制器上测试了构造函数和 属性 注入:
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 被注入并且 Test属性 总是空的。
我什至在 Index 方法中检查了它的值,它是 null ...
我在应用程序的不同部分尝试了不同的配置,属性 注入总是失败...
有人可以帮我解决这个问题吗?
更新 1
添加.PropertiesAutowired(); RegisterController 适用于控制器但不适用于 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();
但是当我在我的视图中访问测试属性时,它是空的。
为什么?
更新 2
如果在我的布局视图中添加:
@{
var test = DependencyResolver.Current.GetService<ITest>();
}
测试正确解析...
这可能是 Layout Pages 和 Autofac 的问题?
更新 3
我能够重现问题并在 https://github.com/mdmoura/MvcAutofac
中创建了一个项目
如果您 运行 项目将在第二代码行的 _Layout 母版页上出现错误:
@SettingsA.Get()
@SettingsB.Get()
SettingsA 在 ViewPagePage 中使用 DependencyResolver 解析并且有效。
使用 SettingsB 我正在尝试使用 属性 注入但没有成功。
Autofac 配置在 global.asax Application_Start.
有人知道哪里出了问题吗?
属性注入不会在 Autofac 中自动完成。您必须告诉 Autofac 在您的控制器注册中注入属性。
builder.RegisterControllers(typeof(MvcApplication).Assembly)
.PropertiesAutowired();
有关自动装配属性的详细信息,请参阅 Property and Method Injection。
我将 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);
}
然后我在控制器上测试了构造函数和 属性 注入:
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 被注入并且 Test属性 总是空的。
我什至在 Index 方法中检查了它的值,它是 null ...
我在应用程序的不同部分尝试了不同的配置,属性 注入总是失败...
有人可以帮我解决这个问题吗?
更新 1
添加.PropertiesAutowired(); RegisterController 适用于控制器但不适用于 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();
但是当我在我的视图中访问测试属性时,它是空的。
为什么?
更新 2
如果在我的布局视图中添加:
@{
var test = DependencyResolver.Current.GetService<ITest>();
}
测试正确解析...
这可能是 Layout Pages 和 Autofac 的问题?
更新 3
我能够重现问题并在 https://github.com/mdmoura/MvcAutofac
中创建了一个项目如果您 运行 项目将在第二代码行的 _Layout 母版页上出现错误:
@SettingsA.Get()
@SettingsB.Get()
SettingsA 在 ViewPagePage 中使用 DependencyResolver 解析并且有效。
使用 SettingsB 我正在尝试使用 属性 注入但没有成功。
Autofac 配置在 global.asax Application_Start.
有人知道哪里出了问题吗?
属性注入不会在 Autofac 中自动完成。您必须告诉 Autofac 在您的控制器注册中注入属性。
builder.RegisterControllers(typeof(MvcApplication).Assembly)
.PropertiesAutowired();
有关自动装配属性的详细信息,请参阅 Property and Method Injection。