Prism 2.1: доступ к контейнеру IOC из App.xaml? - PullRequest
4 голосов
/ 17 декабря 2009

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

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

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

Ответы [ 2 ]

2 голосов
/ 01 января 2010

Если вы сделаете 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 голосов
/ 15 августа 2012

В моем MEF-приложении Prism 4 у меня нет доступа к контейнеру через экземпляр загрузчика (свойство контейнера защищено).

Для такой функциональности я создаю специальные методы в своем классе начальной загрузки, которые получают или устанавливают необходимые объекты, такие как логгер или что-то еще.

В случае варианта 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;
    }

    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...