2009-03-10 9 views
2

Ich habe eine Webanwendung basierend auf dem sharp-architecture Framework. Es verwendet tatsächlich NHibernate für den dal und ich habe eine Service-Schicht zwischen dem (VIEW-CONTROLLER) und dem DAL hinzugefügt.Quartz.net + NHibernate + Windsor.Castle + CommonServiceLocator

Ich muss tatsächlich einen Scheduler implementieren, um meine Jobs häufig auszuführen. Ich werde Quartz.net verwenden, um diese Aufgabe zu erledigen. Eigentlich habe ich ein Problem. Weil ich viele Jobs haben werde, die zu unterschiedlichen Zeiten laufen, wie alle 30 Sekunden, jeden Tag, jede Woche.

Ich möchte wissen, ob es einen Weg gibt NHibernate mit Service Injektion innerhalb Quarz laufen, und wenn es Job Zustimmung unterstützen wird, ich meine, wenn zwei Jobs läuft simultaniously, wenn es mit NHibernate keine Probleme . Ich weiß, dass es ein Problem mit NHibernate und Multithreading gibt.

Ich fand eine Implementierung von Quartz.Net für Spring (http://www.zorched.net/2009/03/07/using-quartznet-springnet-and-nhibernate-to-run-scheduled-tasks-in-aspnet/) und eine Implementierung für Castle-Windsor (http://bugsquash.blogspot.com/2009/03/windsor-facility-for-quartznet.html).

Das Problem ist, ich denke, diese Beispiele kümmern sich nicht um den Fall, dass Jobs simultan ausgeführt werden können, das ist ein Nhibernate-Problem. Und ich möchte CommonServiceLocator verwenden, um höher zu sein und mich nicht auf einen IoC Rahmen zu begrenzen.

Was kann der beste Ansatz sein, um dieses Problem zu lösen?

Danke für Ihre Hilfe

+0

Wo planen Sie CommonServiceLocator genau zu benutzen? Ich sehe nicht, wie du hier davon profitieren würdest. –

Antwort

3

Verwenden Sie die NHibernate facility, injizieren dann ISessionManager in Ihrem IJob s. Das sollte Ihnen eine ISession pro Thread geben und Sie sollten keine Probleme haben.

+0

In meinen Jobs verwende ich Workflow Foundation, um die Logik besser lesbar zu machen. In jeder Aktivität muss ich auf bestimmte Dienste zugreifen, und ich benutze CommonServiceLocator, weil ich in einer Zeile die Dienste bekomme: var orderService = (IOrderService) ServiceLocator.Current.GetService (typeof (IOrderService)); – alexl

+0

injizieren Sie den IOrderService (push) statt nachzufragen (pull). Erinnern Sie sich an das Hollywood-Prinzip ... –

+0

Sehen Sie sich die Workflow-Einrichtung an (http://using.castleproject.org/display/Contrib/Castle.Facilities.WorkflowIntegration), wenn Sie Services in Ihren Workflow-Inhalt einfügen müssen –

Verwandte Themen