2011-05-20 19 views
6

estoy usando la Unidad, y se registra un registrador de la siguiente manera:registro y uso de un registrador con Unity en global.asax

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"); 
    } 

que parece funcionar bien - se registra el mensaje. Más tarde, en los global.asax.cs tengo unas pocas cosas:

protected void Application_End() 
    { 
     _logger.Info("App is shutting down"); 
    } 

    protected void Application_Error() 
    { 
     Exception lastException = Server.GetLastError(); 
     _logger.Fatal(lastException); 
    } 

Sin embargo, esto produce una excepción - _logger es nulo. Sospecho que estoy haciendo algo mal con Unity, entonces, ¿cuál es la forma correcta de usar un registrador dentro de global.asax?

Respuesta

3

En realidad, querrá volver a resolverlo desde DependencyResolver en cada método donde lo use. Si utiliza una aplicación con un alcance de LifetimeManager, no debe incurrir en ningún golpe de rendimiento significativo del constructor. Si no está utilizando una aplicación con el alcance LiftimeManager, ¡al menos no recibirá un 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); 
    } 
} 
0

Otra forma es hacer que el registrador estático:

private static ILogger _logger; 

Su aplicación registrador tiene que ser seguro para subprocesos, por supuesto.

Cuestiones relacionadas