2010-03-24 40 views
5

我使用以下命令:如何在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之前使用新的会话实例。 我该如何使用结构图来做到这一点?我必须创建一个消息模块吗?

+1

您是否使用messagemodule来处理会话的打开? – 2010-03-24 17:58:00

+0

目前没有,我只是使用结构图解析会话。我一定要吗? – Paco 2010-03-24 17:59:21

+0

你是对的,同一个会话用于对同一个线程的所有请求。这是因为NSB不会为每个请求创建新线程。我现在没有解决方法,需要多考虑一下。 – 2010-03-24 19:09:35

回答

3

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

1.Extend线程存储生命周期和如下把它挂一个消息模块

public class NServiceBusThreadLocalStorageLifestyle : ThreadLocalStorageLifecycle, IMessageModule 
{ 

    public void HandleBeginMessage(){} 

    public void HandleEndMessage() 
    { 
     EjectAll(); 
    } 

    public void HandleError(){} 
} 

2.Configure您structuremap:

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

希望这有助于!

+0

感谢您的帮助!这工作。 – Paco 2010-03-25 09:46:56

+1

很高兴听到!我会尽快将自定义生命周期包含在我们的StructureMap对象生成器中。 – 2010-03-25 10:01:42

+0

StructureMap构建器的主干版本现在包含上述生命周期 – 2010-04-02 08:20:12

相关问题