我正在尝试修改现有的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会寻找构造函数而不是获取公共属性?
答案 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模块应该处理你想要实现的目标。