NLog GetCurrentClassLogger() NullReferenceException с использованием StructureMap (полное доверие)
Кажется, что NLog не может использовать отражение для GetCurrentClassLogger()
хотя мое приложение MVC 3 развернуто в среде полного доверия на 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 ответ
Оказывается, это не проблема доверия, а проблема 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);