使用StructureMap NLOG GetCurrentClassLogger()的NullReferenceException(完全信任) [英] NLog GetCurrentClassLogger() NullReferenceException using StructureMap (Full Trust)
问题描述
好像NLOG不能使用反射对 GetCurrentClassLogger()
,即使我的MVC 3应用程序部署在完全信任环境IIS7上。我使用StructureMap 2.6.1和问题似乎部署之间出现零星。我想不通为什么,但我不认为StructureMap导致它做的。
引导程序
类:
公共静态类引导程序
{
公共静态无效ConfigureStructureMap()
{
ObjectFactory.Initialize(初始化);
} 私有静态无效初始化(IInitializationEx pression X)
{
x.AddRegistry(新DBServiceRegistry());
x.AddRegistry(新MyRegistry());
}
}
注册表
类:
公共类MyRegistry:注册表
{
公共MyRegistry()// HttpContext的背景下)
{
对于与所述; ILogger>()使用<。NLogLogger>();
对于与所述; IUserRepository>()使用<。SqlUserRepository>();
}
}
一切的伟大工程的我的机器上的。为什么我得到一个 System.NullReferenceException:部署时未将对象引用设置到对象
错误的实例
[NullReferenceException异常:未将对象引用设置到对象的实例]
NLog.LogManager.GetCurrentClassLogger()+84
lambda_method(封闭,IArguments)+ 40
StructureMap.Construction<> c__DisplayClass2< CreateBuilder> b__0(IArguments参数)+22
StructureMap.Construction.InstanceBuilder.BuildInstance(IArguments参数)+12
StructureMap.Pipeline.ConstructorInstance.Build(类型pluginType,BuildSession会议,IInstanceBuilder建设者)+88[StructureMapException:StructureMap异常code:207
内部异常,同时创造PluginType Todo.Data.ILogger的实例38000383-149d-45c2-a8f3-7442316da725。详细信息请参考内部异常。]
StructureMap.Pipeline.ConstructorInstance.Build(类型pluginType,BuildSession会议,IInstanceBuilder建设者)+276
StructureMap.Pipeline.ConstructorInstance.build(类型pluginType,BuildSession会话)+41
StructureMap.Pipeline.SmartInstance_1.build(类型pluginType,BuildSession会话)+43
StructureMap.Pipeline.Instance.createRawObject(类型pluginType,BuildSession会话)+45
StructureMap.Pipeline.Instance.Build(类型pluginType,BuildSession会话)+36
StructureMap.Pipeline.ObjectBuilder.Resolve(类型pluginType,实例的实例,BuildSession会话)+103
StructureMap.BuildSession.CreateInstance(类型pluginType,实例实例)+49
StructureMap<方式>&c__DisplayClass3 LT; .ctor> b__1()+22
StructureMap.BuildSession.CreateInstance(类型pluginType)+24
...等...剪断
原来这不是一个信任问题,而是一个IoC问题。由于采用了<一个href=\"http://stackoverflow.com/questions/3438162/asp-net-mvc2-ninject-nlog-shared-hosting-nullreferenceexception/6487008#6487008\">NInject解决方案获取转向我在正确的方向。
解决方案
有关日志记录的包装,使用接受一个字符串参数的构造函数:
公共类NLogLogger:ILogger
{
私人记录仪_logger; 公共NLogLogger(字符串currentClassName)
{
_logger = LogManager.GetLogger(currentClassName);
}
...
}
NLOG StructureMap配置:
对少于ILogger&GT;()使用&lt;&NLogLogger GT;()
.Ctor&LT;串GT(currentClassName)
。是(X =&GT; x.BuildStack.Root.RequestedType.FullName);
It seems like NLog can't use reflection for GetCurrentClassLogger()
, even though my MVC 3 app is deployed in a Full Trust environment on IIS7. I'm using StructureMap 2.6.1 and the problem seems to appear sporadically between deploys. I can't figure out why, though I don't think StructureMap is causing it.
Bootstrapper
class:
public static class Bootstrapper
{
public static void ConfigureStructureMap()
{
ObjectFactory.Initialize(Init);
}
private static void Init(IInitializationExpression x)
{
x.AddRegistry(new DBServiceRegistry());
x.AddRegistry(new MyRegistry());
}
}
Registry
class:
public class MyRegistry : Registry
{
public MyRegistry()//HttpContext context)
{
For<ILogger>().Use<NLogLogger>();
For<IUserRepository>().Use<SqlUserRepository>();
}
}
Everything works great on my machine. Why am I getting a System.NullReferenceException: Object reference not set to an instance of an object
error when deploying?
[NullReferenceException: Object reference not set to an instance of an object.]
NLog.LogManager.GetCurrentClassLogger() +84
lambda_method(Closure , IArguments ) +40
StructureMap.Construction.<>c__DisplayClass2.<CreateBuilder>b__0(IArguments args) +22
StructureMap.Construction.InstanceBuilder.BuildInstance(IArguments args) +12
StructureMap.Pipeline.ConstructorInstance.Build(Type pluginType, BuildSession session, IInstanceBuilder builder) +88
[StructureMapException: StructureMap Exception Code: 207
Internal exception while creating Instance '38000383-149d-45c2-a8f3-7442316da725' of PluginType Todo.Data.ILogger. Check the inner exception for more details.]
StructureMap.Pipeline.ConstructorInstance.Build(Type pluginType, BuildSession session, IInstanceBuilder builder) +276
StructureMap.Pipeline.ConstructorInstance.build(Type pluginType, BuildSession session) +41
StructureMap.Pipeline.SmartInstance_1.build(Type pluginType, BuildSession session) +43
StructureMap.Pipeline.Instance.createRawObject(Type pluginType, BuildSession session) +45
StructureMap.Pipeline.Instance.Build(Type pluginType, BuildSession session) +36
StructureMap.Pipeline.ObjectBuilder.Resolve(Type pluginType, Instance instance, BuildSession session) +103
StructureMap.BuildSession.CreateInstance(Type pluginType, Instance instance) +49
StructureMap.<>c__DisplayClass3.<.ctor>b__1() +22
StructureMap.BuildSession.CreateInstance(Type pluginType) +24
...etc...snipped
Turns out it's not a trust issue, but an IoC issue. Thanks to an NInject solution for steering me in the right direction.
Solution
For your logging wrapper, use a constructor that accepts a string parameter:
public class NLogLogger : ILogger
{
private Logger _logger;
public NLogLogger(string currentClassName)
{
_logger = LogManager.GetLogger(currentClassName);
}
...
}
NLog StructureMap Config:
For<ILogger>().Use<NLogLogger>()
.Ctor<string>("currentClassName")
.Is(x => x.BuildStack.Root.RequestedType.FullName);
这篇关于使用StructureMap NLOG GetCurrentClassLogger()的NullReferenceException(完全信任)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!