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

相關問題