我在多租户设置中使用NInject,我正在设置 n 数量的轮询器。
对于服务类中的每个线程,我希望每个绑定的类都能获得一个NHibernate会话,该会话依赖于线程中使用的租户(创建的轮询器)。我已经在网络方面使用了类似的东西,我将它绑定到请求中的会话变量并让ISession。
示例代码如下:
在服务init类....
////Tenant is a static ThreadLocal, Helper gets session for right tenant...
kernel.bind<ISession>().ToMethod(Helper.getSession(Poller.Tenant).WhenClassHas<UseTenant>();
//for each tenant, start thread{
this.Poller = new Poller(kernel, s.tenantKey);
//// Clean up from an unsafe shutdown
Task.Factory.StartNew(() =>
{
this.Poller.CleanUpFromShutdown();
})
.ContinueWith(t =>
{
this.PollerThread = Thread.CurrentThread;
this.Poller.StartPolling();
});
}
简化的轮询类
public class Poller{
public static ThreadLocal<tenant> ten = new ThreadLocal<tenant>();
public static Tenant Tenant{
get{
return ten.Value();
}
set{
ten.Value = value;
}
}
public IKernel kernel;
public Poller(Kernel kernel, int tenantKey)
{
Tenant = kernel.Get<TenantService>().getTenantbykey(tenantKey);
this.kernel = kernel;
}
public void StartPolling()
{
do{
//Attaches FooService each respective tenant session factory
var kernel.Get<FooService>().GetAllFoos();
//do business logic
//then sleep until next poll interval
}while(NotCanceled)
}
}
编辑:注意到我没有真正使用过问题。
似乎比绑定到ThreadLocal有更好的方法。
此外,在StartPolling()和CleanUpFromShutDown()中,我需要在使用任何相应的会话之前重置租户。