2010-03-24 23 views
5

aşağıdaki kullanın: threadlocal depolama ileNServicebus ileti işleyicisinde nasıl çoklu depoları enjekte edebilirim?

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

Benim sorundur, aynı oturum bütün uygulama parçacığı sırasında kullanılan olmasıdır. İlk seviye önbelleğin temizlenmediğini gördüğümde bunu keşfettim. İstediğim, IHandleMessages <> .Handle'ye yapılan her aramadan önce yeni bir oturum örneği kullanıyor. Bunu structuremap ile nasıl yapabilirim? Mesaj modülü oluşturmalı mıyım?

+1

Oturumun açılışını yapmak için bir messagemodule kullanıyor musunuz? –

+0

Şu anda, yalnızca oturumu çözmek için structuremap kullanıyorum. Zorunda mıyım? – Paco

+0

Aynı seanstaki tüm talepler için aynı seans kullanılır. Bunun nedeni, NSB'nin her istek için yeni ileti dizileri oluşturmamasıdır. Şu anda bir geçici çözümüm yok, bunu biraz daha düşünmeliyim. –

cevap

3

Aynı oturumda, aynı iş parçacığına yapılan tüm isteklerde aynı oturum kullanılır. Bunun nedeni, NSB'nin her istek için yeni ileti dizileri oluşturmamasıdır. Çözüm, özel bir önbellek modu eklemek ve mesaj işleme tamamlandığında temizlemektir.

1.Extend iplik depolama ömrü ve aşağıdaki gibi bir mesaj modülü

public class NServiceBusThreadLocalStorageLifestyle : ThreadLocalStorageLifecycle, IMessageModule 
{ 

    public void HandleBeginMessage(){} 

    public void HandleEndMessage() 
    { 
     EjectAll(); 
    } 

    public void HandleError(){} 
} 

2.Configure senin StructureMap bağlamana: Bu yardımcı olur

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

Umut!

+0

Yardımlarınız için teşekkürler! Bu çalışıyor. – Paco

+1

Duymak güzeldi! Özel yaşam döngüsünü StructureMap nesne oluşturucumuza mümkün olan en kısa sürede dahil edeceğim. –

+0

StructureMap oluşturucusunun gövde sürümü artık yukarıdaki yaşam döngüsünü içeriyor –

İlgili konular