Ciclo di vita dei componenti in un servizio windows

rated by 0 users
This post has 7 Replies | 1 Follower

Top 10 Partecipanti
Maschio
Post 268
Punteggio 4.907
petrux Posted: 08-25-2010 13.22
Ciao a tutti,

ho una applicazione web che fa tutte le sue belle cosette, con la sua
BL, le sue entità, ecc ecc. Parallelamente, ho un servizio windows che a
mezzanotte di ogni giorno legge il db scritto durante il giorno
dall'applicazione e fa partire dei job notturni.

Per pulizia, mi sembra opportuno che il servizio utilizzi gli stessi
servizi di business, le stesse entità e la stessa infrastruttura (log,
persistenza, ecc ecc...) usata dall'applicazione web. Mentre
nell'applicazione web mi è facile capire che:
- il bootstrap del container di IoC, ecc ecc... lo faccio all'avvio
dell'applicazione;
- la creazione di componenti come il data context, ecc ecc... va fatto a
ogni richiesta;
con il servizio windows mi viene un po' meno immediato. Mi conviene
instanziare il container ogni volta che il job parte oppure una tantum,
e fare un parallelo tra il job e la web request nell'app web?


Ciao e grazie,
Giulio

--
  • | Punteggio Post: 20
Top 25 Partecipanti
Maschio
Post 30
Punteggio 678

Ciao Giulio,

a naso, mi verrebbe da dire: istanzi il container allo startUp del servizio, e limiti il lifecycle dei componenti alla durata del job stesso. Come fare questa cosa dipende dal container IoC che utilizzi, con Ninject ad esempio puoi avviare un ActivationBlock() prima di istanziare il Job, e chiuderlo al termine dell'esecuzione del job stesso per rilasciare tutti gli oggetti creati nel frattempo...

Ciao,
neronotte 

  • | Punteggio Post: 35
Top 10 Partecipanti
Post 143
Punteggio 2.560
Ciao neronotte,

You wrote on 25/08/2010 :
> a naso, mi verrebbe da dire: istanzi il container allo startUp del servizio,
> e limiti il lifecycle dei componenti alla durata del job stesso. Come fare
> questa cosa dipende dal container IoC che utilizzi, con Ninject ad esempio
> puoi avviare un ActivationBlock() prima di istanziare il Job, e chiuderlo al
> termine dell'esecuzione del job stesso per rilasciare tutti gli oggetti
> creati nel frattempo...

+1, il ciclo di vita del container ha senso che coincida con quello del
servizio, probabilmente i componenti ha senso che coincidano con i
"job", ma valuta attentamente perch� se i componenti sono stateless
tutta la vita singleton e a questo punto il loro ciclo di vita coincide
con quello del servizio.

..m

--
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @ http://milestone.topics.it
whynot [ at ] topics [ dot ] it
  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 268
Punteggio 4.907
Ciao Mauro,
Ciao neronotte,

Grazie per i consigli.

mauroservienti wrote:
> Ciao neronotte,
[cut]
> +1, il ciclo di vita del container ha senso che coincida con quello del
> servizio, probabilmente i componenti ha senso che coincidano con i
> "job", ma valuta attentamente perche' se i componenti sono stateless
> tutta la vita singleton e a questo punto il loro ciclo di vita coincide
> con quello del servizio.

No, non dovrei avere singleton. L'unico componente che potrebbe avere un
ciclo di vita pari a quello del servizio è la sessio factory di
NHibernate. Che ne dici?


Ciao,
Giulio
--
  • | Punteggio Post: 20
Top 10 Partecipanti
Post 143
Punteggio 2.560
Ciao petrux,

You wrote on 26/08/2010 :
> No, non dovrei avere singleton. L'unico componente che potrebbe avere un
> ciclo di vita pari a quello del servizio è la sessio factory di
> NHibernate. Che ne dici?

la factory ha moltissimo senso che venga creata subito e mai distrutta
per tutto il ciclo di vita del servizio.

..m

--
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @ http://milestone.topics.it
whynot [ at ] topics [ dot ] it
  • | Punteggio Post: 5
Top 10 Partecipanti
Maschio
Post 268
Punteggio 4.907
Ciao neronotte,
Ciao a tutti,

  • | Punteggio Post: 20
Top 10 Partecipanti
Post 143
Punteggio 2.560
Ciao petrux,

You wrote on 30/08/2010 :
> chiedo preventivamente scusa per la domanda stupida che sto per fare
> ma... fisicamente come cablo lo startup nel servizio? Sarà che la ripresa
> dopo le ferie è dura ma non riesco proprio a figurarmi come implementare
> il bootstrap. :-)
>

nell'onstart del servizio avvi il worker thread che gestisce la tua
logica, la prima cosa che il worker thread far� sar� quella di avviare
la fase di bootstrape poi mettersi in "attesa" di connessioni.

> Ciao e grazie, petrux

..m

--
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @ http://milestone.topics.it
whynot [ at ] topics [ dot ] it
  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
Post 268
Punteggio 4.907
Ciao Mauro,

  • | Punteggio Post: 5
Pagina 1 di 1 (8 elementi) | RSS
Powered by Community Server (Commercial Edition), by Telligent Systems