2010-06-01 10 views
2

J'essaye d'implémenter un modèle d'observateur utilisant ninject et NHibernate. J'aimerais pouvoir injecter des observateurs qui agissent comme des "déclencheurs" lorsqu'un objet est conservé ou supprimé via NHibernate.Ninject/NHibernate Events + Observateur Pattern

points- clés

  1. Je veux l'observateur à notifier chaque fois qu'un objet est persisté, y compris en cascade permet d'économiser, ce qui explique pourquoi je me sers des événements NHibernate postInsert/PostUpdate.
  2. Je veux être capable d'injecter les observateurs via Ninject (ne veux pas le noyau n'importe où dans les gestionnaires d'événements nhibernate). Les observateurs sont différents en fonction du type d'objet persistant, j'ai donc besoin d'un bon moyen de savoir quels observateurs devraient être appelés dans les événements NHibernate.

Mon code fonctionne très bien maintenant pour les objets qui sont chargés via NHibernate en utilisant l'injection de constructeur. Une classe d'observateur est injectée dans le modèle de domaine, qui est transporté à travers les événements nhibernate et peut être déclenché sans problème. Le problème: Notre base de code existante utilise des constructeurs par défaut pour nos objets de domaine par rapport à une usine. Pour cette raison, les observateurs ne seront pas injectés à moins que nous passions à l'utilisation d'une usine. Je sais que tout changer à une usine fonctionnera, mais je voulais voir si quelqu'un a de meilleures suggestions pour accomplir cela. Alors, devrais-je créer une usine pour instancier de nouveaux objets ou autre chose?

+0

donc vous ne pouvez pas mettre ctor sur les objets de domaine avec les dépendances énumérées dans les arguments ctor? – AaronHS

Répondre

1

Il semble que vous vous compliquiez la vie en essayant de placer le pattern Observer au-dessus du pattern Event Manager de NHibernate. NHibernate fournit déjà un moyen d'avoir des écouteurs d'événements connectables - pourquoi ne pas s'en servir uniquement?

class FooPostInsertEventListener : IPostInsertEventListener 
{ 
    public void OnPostInsert(PostInsertEvent @event) 
    { 
     var entity = @event.Entity; 
     var entityType = entity.GetType(); 

     if (entityType != typeof(Foo)) return; 

     ProcessFoo(entity); 
    } 
} 

Si vous êtes désespéré de passer par le noyau, vous pouvez même utiliser le noyau lors de la configuration NHibernate. Quelque chose comme ceci:

config.EventListeners.PostInsertEventListeners = Kernel.GetAll<IPostInsertEventListener>().ToArray();