2009-12-16 6 views
4

Je crée une application Prism 2.1 dans laquelle j'ai implémenté la journalisation, en utilisant Log4Net dans un enregistreur personnalisé dérivé de ILoggerFacade. La journalisation fonctionne très bien; Je résous simplement ILoggerFacade contre le conteneur d'IOC, et il renvoie mon enregistreur, auquel j'envoie un message de la manière habituelle.Prism 2.1: Accéder au conteneur IOC depuis App.xaml?

Voici mon problème: Je veux enregistrer l'exit de l'application, et la manière logique de le faire semble être de surcharger OnExit() dans App.xaml.cs. Mais je ne peux pas comprendre comment obtenir une référence au conteneur à partir App.xaml.cs, afin que je puisse résoudre mon enregistreur. Est-ce que je peux référencer le conteneur Prism IOC à partir de App.xaml.cs?

Si c'est le cas, comment? Merci.

Répondre

2

Si vous rendez le Bootstrapper global dans App.xaml.cs, alors vous pouvez accéder au Container à l'intérieur.

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

Dans mon prisme 4 MEF- application que je n'a pas accès à des conteneurs par exemple bootstrapper (propriété Container est protégée).

Pour une telle fonctionnalité, je crée des méthodes spéciales dans ma classe bootstrapper qui obtiennent ou définissent des objets nécessaires comme un enregistreur ou autre chose.

Dans le cas de la variante Cameron, il ressemble à ceci:

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

    ... 
} 
Questions connexes