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?
Czy używasz messagemodule do obsługi otwierania sesji? –
Obecnie nie, po prostu używam structuremap do rozwiązania sesji. Czy muszę? – Paco
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. –