Как я могу ввести несколько репозиториев в обработчике сообщений 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<>));
   }
}

Моя проблема с threadlocal устройством хранения данных, то, что та же сессия используется во время целого потока приложения. Я обнаружил это, когда я видел, что первый кэш уровня не был очищен. То, что я хочу, использует новый экземпляр сессии перед каждым вызовом к IHandleMessages <>.Handle. Как я могу сделать это с structuremap? Я должен создать модуль сообщения?

5
задан Paco 24 March 2010 в 16:08
поделиться

1 ответ

Вы правы в том, что один и тот же сеанс используется для всех запросов к одному и тому же потоку. Это связано с тем, что NSB не создает новые потоки для каждого запроса. Обходной путь - добавить настраиваемый режим кеширования и очистить его после завершения обработки сообщений.

1. Продлите жизненный цикл хранилища потоков и подключите его к модулю сообщений

public class NServiceBusThreadLocalStorageLifestyle : ThreadLocalStorageLifecycle, IMessageModule
{

    public void HandleBeginMessage(){}

    public void HandleEndMessage()
    {
        EjectAll();
    }

    public void HandleError(){}
}

2. Настройте карту структуры следующим образом:

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

Надеюсь, это поможет!

3
ответ дан 15 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: