Ninject + Poller:根据租户获取会话

时间:2012-03-22 16:58:30

标签: c# service ninject polling multi-tenant

我在多租户设置中使用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()中,我需要在使用任何相应的会话之前重置租户。

0 个答案:

没有答案