2010-03-24 15 views
5

używam następujące:Jak mogę wstrzyknąć wiele repozytoriów w obsługę wiadomości 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<>)); 
    } 
} 

Mój problem z ThreadLocal przechowywania jest to, że ta sama sesja jest stosowany podczas całego wątku aplikacji. Odkryłem to, gdy zobaczyłem, że pamięć podręczna pierwszego poziomu nie została wyczyszczona. Potrzebuję nowej instancji sesji przed każdym wywołaniem IHandleMessages <> .Handle. Jak zrobić to z mapą struktury? Czy muszę utworzyć moduł wiadomości?

+1

Czy używasz messagemodule do obsługi otwierania sesji? –

+0

Obecnie nie, po prostu używam structuremap do rozwiązania sesji. Czy muszę? – Paco

+0

Masz rację, że ta sama sesja jest używana dla wszystkich żądań do tego samego wątku. Dzieje się tak dlatego, że NSB nie tworzy nowych wątków dla każdego żądania. Nie mam obecnie rozwiązania, muszę przemyśleć tę nieco więcej. –

Odpowiedz

3

Masz rację, że ta sama sesja jest używana dla wszystkich żądań do tego samego wątku. Dzieje się tak dlatego, że NSB nie tworzy nowych wątków dla każdego żądania. Rozwiązaniem jest dodanie niestandardowego trybu pamięci podręcznej i usunięcie go po zakończeniu obsługi wiadomości.

1.Extend przechowywanie cyklu nici i go podłączyć moduł wiadomość

public class NServiceBusThreadLocalStorageLifestyle : ThreadLocalStorageLifecycle, IMessageModule 
{ 

    public void HandleBeginMessage(){} 

    public void HandleEndMessage() 
    { 
     EjectAll(); 
    } 

    public void HandleError(){} 
} 

2.Configure Twój StructureMap następująco:

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

Nadzieja to pomaga!

+0

Dzięki za pomoc! To działa. – Paco

+1

Miło słyszeć! Zamierzam włączyć niestandardowy cykl życia do naszego konstruktora obiektów StructureMap, tak szybko, jak to możliwe. –

+0

Wersja procesora budowania StructureMap obejmuje teraz powyższy cykl życia –