gpt4 book ai didi

nhibernate - 如何在 NServicebus 消息处理程序中注入(inject)多个存储库?

转载 作者:行者123 更新时间:2023-12-04 20:59:28 24 4
gpt4 key购买 nike

我使用以下内容:

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

我对线程本地存储的问题是,在整个应用程序线程中使用相同的 session 。当我看到一级缓存未被清除时,我发现了这一点。我想要的是在每次调用 IHandleMessages<>.Handle 之前使用一个新的 session 实例。
我怎样才能用结构图做到这一点?我必须创建一个消息模块吗?

最佳答案

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

1.延长线程存储生命周期,挂接一个消息模块

public class NServiceBusThreadLocalStorageLifestyle : ThreadLocalStorageLifecycle, IMessageModule
{

public void HandleBeginMessage(){}

public void HandleEndMessage()
{
EjectAll();
}

public void HandleError(){}
}

2.配置你的结构图如下:
For<<ISession>>
.LifecycleIs(new NServiceBusThreadLocalStorageLifestyle())
...

希望这可以帮助!

关于nhibernate - 如何在 NServicebus 消息处理程序中注入(inject)多个存储库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2509295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com