AutoFac:容器构建

时间:2017-05-19 08:27:13

标签: c# autofac

我在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)

1 个答案:

答案 0 :(得分:1)

我发现了这个问题。 我在模块(MyAppContext)中使用了一个私有属性,它不是由autofac.config设置的。我把它改成私人领域,现在正在工作。