Prism 2.1: Доступ к контейнеру IOC из App.xaml?

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

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

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


person David Veeneman    schedule 16.12.2009    source источник


Ответы (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);
    }
}
person Cameron MacFarland    schedule 01.01.2010

В моем 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;
    }

    ...
}
person Eugene    schedule 15.08.2012