我在Web API / OWIN环境中使用AutoFac 4.6.0和XML配置文件和模块。
当我调用ContainerBuilder的Build()时,我得到一个NullReferenceException。 我究竟做错了什么?是吗,因为" TheFailingModule"在另一个集会?如果我添加属性" Foo"到" TestModule",它可以工作。
我在模块的加载方法中添加了一个断点,它们没有被击中。
更新
我发现,私有财产MyAppContext会导致问题。
请参阅代码:
Startup.cs
namespace MyNamespace.Web
{
// [...]
public void Configuration(IAppBuilder app)
{
var configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddXmlFile("autofac.config");
var module = new ConfigurationModule(configurationBuilder.Build());
var builder = new ContainerBuilder();
builder.RegisterModule(module);
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
var config = new HttpConfiguration();
builder.RegisterWebApiFilterProvider(config);
AutoFacConfig.Register(builder);
var container = builder.Build(); // <-- NullReferenceException
// [...]
}
// [...]
}
autofac.config
<?xml version="1.0" encoding="utf-8"?>
<autofac>
<modules name="TestModule">
<type>MyNamespace.Web.TestModule, MyNamespace.Web</type>
</modules>
<modules name="TheFailingModule">
<type>MyNamespace.Failing.TheFailingModule, MyNamespace.Failing</type>
<properties Foo="Bar"></properties>
</modules>
</autofac>
TheFailingModule.cs
namespace MyNamespace.Failing
{
public class TheFailingModule : Module
{
private MyAppContext MyAppContext { get; set; }
public string Foo { get; set; }
protected override void Load(ContainerBuilder builder)
{
// [...]
base.Load(builder);
}
}
}
TestModule
namespace MyNamespace.Web
{
public class TestModule : Module
{
protected override void Load(ContainerBuilder builder)
{
// Do some stuff
base.Load(builder);
}
}
}
栈跟踪
at Autofac.Configuration.Core.ConfigurationExtensions.<>c__DisplayClass3_0.<GetProperties>b__0(ParameterInfo pi, IComponentContext c)
at Autofac.Core.ResolvedParameter.CanSupplyValue(ParameterInfo pi, IComponentContext context, Func`1& valueProvider)
at Autofac.Core.Activators.Reflection.ReflectionActivator.InjectProperties(Object instance, IComponentContext context)
at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
at Autofac.Configuration.Core.ModuleRegistrar.RegisterConfiguredModules(ContainerBuilder builder, IConfiguration configuration)
at Autofac.Configuration.Core.ConfigurationRegistrar.RegisterConfiguration(ContainerBuilder builder, IConfiguration configuration)
at Autofac.Configuration.ConfigurationModule.Load(ContainerBuilder builder)
at Autofac.Module.Configure(IComponentRegistry componentRegistry)
at Autofac.ContainerBuilder.Build(IComponentRegistry componentRegistry, Boolean excludeDefaultModules)
at Autofac.ContainerBuilder.Build(ContainerBuildOptions options)
答案 0 :(得分:1)
我发现了这个问题。 我在模块(MyAppContext)中使用了一个私有属性,它不是由autofac.config设置的。我把它改成私人领域,现在正在工作。