Как я могу добавить несколько репозиториев в обработчик сообщений NServicebus? - PullRequest
5 голосов
/ 24 марта 2010

Я использую следующее:

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

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

1 Ответ

3 голосов
/ 25 марта 2010

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

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

public class NServiceBusThreadLocalStorageLifestyle : ThreadLocalStorageLifecycle, IMessageModule
{

    public void HandleBeginMessage(){}

    public void HandleEndMessage()
    {
        EjectAll();
    }

    public void HandleError(){}
}

2. Сконфигурируйте вашу структуру структуры следующим образом:

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

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

...