2010-03-24 5 views
5

utiliser les éléments suivants:Comment puis-je injecter plusieurs référentiels dans un gestionnaire de messages NServicebus? Je

public interface IRepository<T> 
{ 
    void Add(T entity); 
} 

public class Repository<T> 
{ 
    private readonly ISession session; 

    public Repository(ISession session) 
    { 
    this.session = session; 
    } 

    public void Add(T entity) 
    { 
    session.Save(entity); 
    } 
} 

public class SomeHandler : IHandleMessages<SomeMessage> 
{ 
    private readonly IRepository<EntityA> aRepository; 
    private readonly IRepository<EntityB> bRepository; 

    public SomeHandler(IRepository<EntityA> aRepository, IRepository<EntityB> bRepository) 
    { 
    this.aRepository = aRepository; 
    this.bRepository = bRepository; 
    } 

    public void Handle(SomeMessage message) 
    { 
    aRepository.Add(new A(message.Property); 
    bRepository.Add(new B(message.Property); 
    } 
} 

public class MessageEndPoint : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization 
{ 
    public void Init() 
    { 
     ObjectFactory.Configure(config => 
     { 
      config.For<ISession>() 
       .CacheBy(InstanceScope.ThreadLocal) 
       .TheDefault.Is.ConstructedBy(ctx => ctx.GetInstance<ISessionFactory>().OpenSession()); 
      config.ForRequestedType(typeof(IRepository<>)) 
       .TheDefaultIsConcreteType(typeof(Repository<>)); 
    } 
} 

Mon problème avec le stockage ThreadLocal est, est que la même session est utilisée pendant toute la durée d'exécution d'application. J'ai découvert cela quand j'ai vu que le cache de premier niveau n'était pas effacé. Ce que je veux, c'est utiliser une nouvelle instance de session, avant chaque appel à IHandleMessages <> .Handle. Comment est-ce que je peux faire ceci avec structuremap? Dois-je créer un module de message?

+1

Utilisez-vous un messagemodule pour gérer l'ouverture de la session? –

+0

Actuellement, je n'utilise que structuremap pour résoudre la session. Dois-je? – Paco

+0

Vous avez raison en ce que la même session est utilisée pour toutes les demandes au même thread. C'est parce que NSB ne crée pas de nouveaux threads pour chaque requête. Je n'ai pas de solution de rechange en ce moment, je dois y réfléchir un peu plus. –

Répondre

3

Vous avez raison en ce que la même session est utilisée pour toutes les demandes au même thread. C'est parce que NSB ne crée pas de nouveaux threads pour chaque requête. La solution de contournement consiste à ajouter un mode de cache personnalisé et à l'effacer lorsque la gestion des messages est terminée.

1.Extend le cycle de vie de stockage de fil et de le raccorder un module d'un message

public class NServiceBusThreadLocalStorageLifestyle : ThreadLocalStorageLifecycle, IMessageModule 
{ 

    public void HandleBeginMessage(){} 

    public void HandleEndMessage() 
    { 
     EjectAll(); 
    } 

    public void HandleError(){} 
} 

2.Configurez votre StructureMap comme suit:

For<<ISession>> 
.LifecycleIs(new NServiceBusThreadLocalStorageLifestyle()) 
... 

Hope this helps!

+0

Merci pour votre aide! Cela marche. – Paco

+1

Agréable à entendre! Je vais inclure le cycle de vie personnalisé dans notre générateur d'objets StructureMap dès que possible. –

+0

La version de liaison du générateur StructureMap inclut désormais le cycle de vie ci-dessus –

Questions connexes