Ninject + Poller: получить сессию на основе арендатора - PullRequest
1 голос
/ 22 марта 2012

Я использую NInject в мультитенантной настройке, где я настраиваю n количество опрошенных.

Для каждого потока в классе обслуживания я хочу, чтобы каждый из моих связанных классов получал сеанс NHibernate в зависимости от того, какой клиент используется в потоке (созданный опросник).У меня есть нечто подобное, уже используемое для веб-приложений, где я связал это с переменной сеанса в запросе и разрешил ISession.

Пример кода следующий:

В классе инициализации службы ....

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

РЕДАКТИРОВАТЬ: Замечание Iна самом деле не использовал вопрос.

Похоже, что был бы лучший способ сделать это, чем привязка к ThreadLocal.

Кроме того, в StartPolling () и CleanUpFromShutDown () мне нужно сбросить владельца перед использованием любого из их соответствующих сеансов.

...