使用StructureMap NLOG GetCurrentClassLogger()的NullReferenceException(完全信任) [英] NLog GetCurrentClassLogger() NullReferenceException using StructureMap (Full Trust)

查看:915
本文介绍了使用StructureMap NLOG GetCurrentClassLogger()的NullReferenceException(完全信任)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好像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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆