2010-03-24 7 views
5

que utilizar los siguientes:¿Cómo puedo inyectar múltiples repositorios en un manejador de mensajes NServicebus?

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

Mi problema con el almacenamiento ThreadLocal es, es que la misma sesión se utiliza durante todo el subproceso de la aplicación. Descubrí esto cuando vi que no se borraba el primer nivel de caché. Lo que quiero es usar una nueva instancia de sesión, antes de cada llamada a IHandleMessages <> .Handle. ¿Cómo puedo hacer esto con structuremap? ¿Tengo que crear un módulo de mensaje?

+1

¿Está utilizando un módulo de mensaje para manejar la apertura de la sesión? –

+0

Actualmente no, solo uso structuremap para resolver la sesión. ¿Tengo que? – Paco

+0

Tiene razón, la misma sesión se usa para todas las solicitudes al mismo hilo. Esto se debe a que NSB no crea nuevos subprocesos para cada solicitud. No tengo una solución alternativa en este momento, necesita pensar en esto un poco más. –

Respuesta

3

Tiene razón en que la misma sesión se usa para todas las solicitudes al mismo hilo. Esto se debe a que NSB no crea nuevos subprocesos para cada solicitud. La solución alternativa es agregar un modo de caché personalizado y borrarlo cuando se completa el manejo de mensajes.

1.Extend el ciclo de vida de almacenamiento de hilo y engancharlo hasta un módulo de un mensaje

public class NServiceBusThreadLocalStorageLifestyle : ThreadLocalStorageLifecycle, IMessageModule 
{ 

    public void HandleBeginMessage(){} 

    public void HandleEndMessage() 
    { 
     EjectAll(); 
    } 

    public void HandleError(){} 
} 

2.Configure su StructureMap de la siguiente manera:

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

Espero que esto ayude!

+0

¡Gracias por tu ayuda! Esto funciona. – Paco

+1

¡Encantador de escuchar! Voy a incluir el ciclo de vida personalizado en nuestro generador de objetos StructureMap tan pronto como pueda. –

+0

La versión troncal del constructor StructureMap ahora incluye el ciclo de vida anterior –

Cuestiones relacionadas