Я создаю приложение Prism 2.1, в котором я реализовал ведение журнала, используя Log4Net в пользовательском регистраторе, производном от ILoggerFacade. Ведение журнала работает отлично; Я просто разрешаю ILoggerFacade для контейнера IOC, и он возвращает мой регистратор, которому я отправляю сообщение обычным образом.
Вот моя проблема: я хочу зарегистрировать выход приложения, и логический способ сделать это, по-видимому, состоит в том, чтобы переопределить OnExit() в App.xaml.cs. Но я не могу понять, как получить ссылку на Контейнер из App.xaml.cs, чтобы я мог разрешить свой регистратор.
Могу ли я ссылаться на контейнер IOC Prism из App.xaml.cs? Если да, то как? Спасибо.
Ответ 1 · рейтинг 2 · Cameron MacFarland
Если вы сделаете 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);
}
}
Ответ 2 · Eugene
В моем MEF-приложении Prism 4 у меня нет доступа к Container через экземпляр загрузчика (свойство Container защищено).
Для такой функциональности я создаю специальные методы в своем классе загрузчика, которые получают или устанавливают необходимые объекты, такие как регистратор или что-то еще.
В случае варианта Кэмерона это выглядит так:
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;
}
...
}