Я использую 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 () мне нужно сбросить владельца перед использованием любого из их соответствующих сеансов.