使用WebForms公共属性的Autofac会抛出构造函数异常

时间:2016-03-15 01:53:39

标签: asp.net webforms autofac

我正在尝试修改现有的WebForms应用程序,并希望使用Autofac。据我所知,我已根据文档(http://autofac.readthedocs.org/en/latest/integration/webforms.html#structuring-pages-and-user-controls-for-di)设置了应用程序。

具有公共财产的网页代码

public partial class MyTestPage : Page
{
    public ILogger Logger { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        //page load code here

的web.config

<modules>
<add name="ContainerDisposal" type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web" preCondition="managedHandler" />
  <add name="PropertyInjection" type="Autofac.Integration.Web.Forms.PropertyInjectionModule, Autofac.Integration.Web" preCondition="managedHandler" />
</modules>          

的Global.asax.cs

public class Global : HttpApplication, IContainerProviderAccessor
{
        static IContainerProvider _containerProvider;

        public IContainerProvider ContainerProvider
        {
            get { return _containerProvider; }
        }


    void Application_Start(object sender, EventArgs e)
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<Logger>().As<ILogger>().InstancePerRequest();
        _containerProvider = new ContainerProvider(builder.Build());

    }

当我尝试加载页面时,Autofac会抛出此异常。

没有类型的构造函数&#39; NLog.Logger&#39;可以在构造函数查找器中找到&#39; Autofac.Core.Activators.Reflection.DefaultConstructorFinder&#39;。

我在这里缺少什么?为什么Autofac会寻找构造函数而不是获取公共属性?

1 个答案:

答案 0 :(得分:1)

这里的问题是Autofac正在尝试创建Logger类的实例,以将其注入MyTestPage。它尝试使用默认的无参数构造函数,该构造函数不可用。所以问题不在于您的网页,而在于您的记录器注册。

我对NLog并不熟悉,但根据教程,您可以使用LogManager创建Logger的实例,例如

Logger logger = LogManager.GetCurrentClassLogger();

Logger logger = LogManager.GetLogger("MyClassName");

因此,您应该将注册更改为此类(未经测试):

builder.Register(c => LogManager.GetCurrentClassLogger()).As<ILogger>().InstancePerRequest();

正如我上面提到的,我不熟悉NLog,但我认为NLog Logger类实现了ILogger接口。

编辑:

This模块应该处理你想要实现的目标。