2011-05-20 27 views
6
Ben Unity kullanıyorum

Birlik ile logger kullanımı ve ve böyle bir logger kayıt: görünüyorKayıt 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"); 
    } 

iyi iş - mesaj kaydedilir. _logger null -

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

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

Ancak bu bir istisna atar: Daha sonra global.asax.cs bu var. Unity ile yanlış bir şey yaptığımı sanıyorum - bu yüzden global.asax içinde bir logger kullanmanın doğru yolu nedir?

cevap

3

Aslında onu kullandığınız her yöntemde DependencyResolver'dan yeniden çözümlemek isteyeceksiniz. Bir Uygulama kapsamı LifetimeManager kullanırsanız, kurucudan önemli bir performans isabetine maruz kalmamalısınız. LiftimeManager kapsamındaki bir uygulama kullanmıyorsanız, en azından NullReferenceException ile vurulmayacaksınız!

private static ILogger _logger; 

Kişisel logger uygulama elbette parçacığı güvenli, olmak zorundadır:

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

başka yolu da statik logger yapmaktır.

İlgili konular