如何在NServicebus消息处理程序中注入多个存储库?

时间:2010-03-24 16:08:34

标签: nhibernate structuremap 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&lt;&gt; .Handle之前使用新的会话实例。 我怎么能用structuremap做到这一点?我是否必须创建消息模块?

1 个答案:

答案 0 :(得分:3)

你是对的,同一个会话用于同一个线程的所有请求。这是因为NSB不为每个请求创建新线程。解决方法是添加自定义缓存模式,并在邮件处理完成后将其清除。

1.扩展线程存储生命周期并将其连接到消息模块

public class NServiceBusThreadLocalStorageLifestyle : ThreadLocalStorageLifecycle, IMessageModule
{

    public void HandleBeginMessage(){}

    public void HandleEndMessage()
    {
        EjectAll();
    }

    public void HandleError(){}
}

2.按如下方式配置您的结构图:

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

希望这有帮助!