2009-12-16 2 views
4

Я создаю приложение Prism 2.1, в котором я внедрил ведение журнала, используя Log4Net в пользовательском журнале, полученном из ILoggerFacade. Лесозаготовка отлично работает; Я просто разрешаю ILoggerFacade против контейнера IOC, и он возвращает мой регистратор, на который я отправляю сообщение обычным способом.Prism 2.1: Доступ к контейнеру IOC из App.xaml?

Вот моя проблема: я хочу зарегистрировать выход приложения, и логичным способом сделать это, похоже, является переопределение OnExit() в App.xaml.cs. Но я не могу понять, как получить ссылку на Контейнер из App.xaml.cs, чтобы я мог разрешить мой регистратор.

Могу ли я ссылаться на контейнер Prism IOC из App.xaml.cs? Если да, то как? Благодарю.

ответ

2

Если вы сделаете Bootstrapper глобальным в App.xaml.cs, вы можете получить доступ к Контейнеру внутри него.

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, которые получают или устанавливают необходимые объекты, такие как logger или что-то еще.

В случае варианта Cameron это выглядит следующим образом:

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

    ... 
} 
Смежные вопросы