我正在使用Unity,我注册了一个这样的记录器:
public class MvcApplication : System.Web.HttpApplication
{
private ILogger _logger;
protected void Application_Start()
{
...
var container = new UnityContainer();
container.RegisterType<ILogger, NLogLogger>();
container.RegisterControllers();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
_logger = container.Resolve<ILogger>();
_logger.Info("Application started");
}
这似乎工作正常 - 记录消息。 后来在global.asax.cs中我有这个:
protected void Application_End()
{
_logger.Info("App is shutting down");
}
protected void Application_Error()
{
Exception lastException = Server.GetLastError();
_logger.Fatal(lastException);
}
但是,这会引发异常 - _logger为null。我怀疑我在使用Unity做错了什么 - 那么在global.asax中使用记录器的正确方法是什么?
答案 0 :(得分:4)
您实际上希望在使用它的每个方法中从DependencyResolver重新解析它。如果您使用应用程序作用域LifetimeManager
,那么您不应该从构造函数中获得任何重大性能损失。如果您没有使用范围LiftimeManager
的应用程序,那么至少您不会被NullReferenceException
命中!
protected void Application_End()
{
var logger = DependencyResolver.Current.GetService<ILogger>();
if(logger != null)
{
logger.Info("App is shutting down");
}
}
protected void Application_Error()
{
Exception lastException = Server.GetLastError();
var logger = DependencyResolver.Current.GetService<ILogger>();
if(logger != null)
{
logger.Fatal(lastException);
}
}
答案 1 :(得分:-1)
另一种方法是使记录器保持静态:
private static ILogger _logger;
当然,您的记录器实现必须是线程安全的。