2009-12-16 74 views
4

我正在創建一個Prism 2.1應用程序,在該應用程序中,我使用Log4Net在從ILoggerFacade派生的自定義記錄器中實現了日誌記錄。記錄工作很好;我簡單地解析ILoggerFacade對IOC容器,它返回我的記錄器,我以通常的方式發送消息。棱鏡2.1:從App.xaml訪問IOC容器?

這是我的問題:我想記錄應用程序退出,並且執行此操作的邏輯方法似乎是在App.xaml.cs中重寫OnExit()。但我無法弄清楚如何從App.xaml.cs中獲取對容器的引用,以便我可以解析我的記錄器。

我可以從App.xaml.cs中引用Prism IOC容器嗎?如果是這樣,怎麼樣?謝謝。

回答

2

如果您在App.xaml.cs中創建Bootstrapper全局,則可以訪問其中的Container。

public partial class App : Application 
{ 
    private static UnityBootstrapper bootstrapper; 

    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 

     bootstrapper = new MyBootstrapper(); 
     bootstrapper.Run(); 
    } 

    protected override void OnExit(ExitEventArgs e) 
    { 
     ILoggerFacade logger = bootstrapper.Container.Resolve<ILoggerFacade>(); 
     logger.Log("Application Exitting", Category.Info, Priority.Low); 

     base.OnExit(e); 
    } 
} 
0

在我的Prism 4 MEF應用程序中,我無法通過bootstrapper實例訪問Container(容器屬性受保護)。

對於這樣的功能,我在我的bootstrapper類中創建了特殊的方法來獲取或設置需要的對象,如記錄器或其他東西。

在卡梅倫變型的情況下,它看起來像這樣:

public partial class App : Application 
{ 
    private Bootstrapper _bootstrapper; 

    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 

     _bootstrapper = new MyBootstrapper(); 
     _bootstrapper.Run(); 
    } 

    protected override void OnExit(ExitEventArgs e) 
    { 
     ILoggerFacade logger = bootstrapper.GetLogger(); 
     logger.Log("Application Exitting", Category.Info, Priority.Low); 

     base.OnExit(e); 
    } 
} 

class MyBootstrapper : MefBootstrapper 
{ 
    public ILoggerFacade GetLogger() 
    { 
     return Container.GetExportedValue<ILoggerFacade>(); 
     // as for Logger you can get it by property of Bootstrapper class: 
     // return Logger; 
    } 

    ... 
}