NLog GetCurrentClassLogger () NullReferenceException с использованием StructureMap (полное доверие) - PullRequest
12 голосов
/ 23 декабря 2010

Кажется, что NLog не может использовать отражение для GetCurrentClassLogger(), хотя мое приложение MVC 3 развернуто в среде Full Trust на IIS7. Я использую StructureMap 2.6.1, и проблема, кажется, появляется время от времени между развертываниями. Я не могу понять, почему, хотя я не думаю, что StructureMap вызывает это.

Bootstrapper класс:

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 класс:

public class MyRegistry : Registry
{
    public MyRegistry()//HttpContext context)
    {
        For<ILogger>().Use<NLogLogger>();
        For<IUserRepository>().Use<SqlUserRepository>();
    }
}

Все отлично работает на моей машине . Почему при развертывании возникает ошибка System.NullReferenceException: Object reference not set to an instance of an object?

[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

1 Ответ

28 голосов
/ 24 декабря 2010

Оказывается, это не проблема доверия, а проблема IoC.Благодаря NInject решение для направления меня в правильном направлении.

Решение

Для вашей оболочки журнала, используйте конструктор, который принимает строковый параметр:

public class NLogLogger : ILogger
{
    private Logger _logger;

    public NLogLogger(string currentClassName)
    {
        _logger = LogManager.GetLogger(currentClassName);
    }
    ...
}

Конфигурация NLog StructureMap:

For<ILogger>().Use<NLogLogger>()
    .Ctor<string>("currentClassName")
    .Is(x => x.BuildStack.Root.RequestedType.FullName);
...