Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Langages serveur > ASP
ASP Forum sur la programmation ASP. Avant de poster : Cours ASP, FAQ ASP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/08/2007, 09h58   #1
Invité de passage
 
Inscription : août 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 5
Points : 0
Points : 0
Par défaut Création d'un Singleton

Bonjour,

Je développe actuellement sur un site en ASP, et je me sers de plusieurs classes pour centraliser mon code.
Seulement j'aimerais savoir si il est possible de créer un Singleton en ASP?
ou si il existe une astuce pour "simuler" ce singleton, et donc rappeler toujours la même instance de mon objet?

J'ai trouvé beaucoup d'exemple en .NET, C#, mais personne n'a l'air de se servir de ca en ASP

Si vous avez une idée, elle serait la bienvenue

Merci d'avance
freneticc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 10h56   #2
Modérateur
 
Avatar de roro06
 
Inscription : avril 2007
Messages : 1 364
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : avril 2007
Messages : 1 364
Points : 1 551
Points : 1 551
Bonjour

Au risque de dire une C......rie, car je ne sais pas trop ce qu'est un singleton, il est possible d'instancier un objet de type COM de manière unique en indiquant dans le fichier global.asa :
Code :
1
2
3
4
5
6
7
8
9
<object
    runat="server"
    scope="Application"
    id="statCP"
    progid="statslogInput.WSC">
</object>

(statCP et statslogInput.WSC étant fonction de l'objet considéré)

Il est possible aussi d'utiliser scope="Session" pour créer une instance par session utilisateur.

l'objet (ou le composant script dans mon cas) doit être enregistré en base de registre.

J'espère que ça peut t'aider .
roro06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 12h28   #3
Invité de passage
 
Inscription : août 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 5
Points : 0
Points : 0
Merci Roro pour ta réponse rapide

En fait ce que je cherche à faire, c'est créer une classe en ASP
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
<%
Class maClasse
 
	private mesinfos
 
		Private Sub Class_Initialize()
 
		  End Sub
 
		  Private Sub Class_Terminate()
 
		  End Sub
 
End Class
 
Set classe = New maClasse
Set classe = Nothing
 
%>
Et au lieu d'appeler maclasse en faisant un New, j'appele l'instance de l'objet en cours.
Ce qui a pour résultat, de me creer un objet si il n'existe pas, de me ramener les attributs et les valeurs qui y sont associés si l'objet existe.


Je ne comprends pas trop ce qu'est un objet de type COM ?
N'y a t'il pas un moyen de le faire sans toucher a la config du serveur?
Pt etre en appelant une fonction par référence?
freneticc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/08/2007, 14h20   #4
Modérateur
 
Avatar de roro06
 
Inscription : avril 2007
Messages : 1 364
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : avril 2007
Messages : 1 364
Points : 1 551
Points : 1 551
Je cains que ce que tu veut faire ne soit pas possible en ASP (d'ailleurs, si c'était possible, je serait vivement interressé )

La méthode que je t'ai donné nécessite effectivement d'intervenir sur le serveur.

Je ne saurais pas précisément expliquer ce qu'est un objet COM, d'autres sauront sûrement le faire mieux que moi.
roro06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 02h29   #5
Invité de passage
 
Inscription : août 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 5
Points : 0
Points : 0
j'ai trouvé ceci, je sais pas ce que t'en pense

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
<% 
 
Dim la_classe
Set la_classe = Nothing 
 
Function getinstance
    If la_classe Is Nothing Then 
        Set la_classe = New maclasse
    End If 
    Set getinstance = la_classe 
End Function 
 
class maclasse
 
   private blabla
 
   function .....
   .....
 
end class
 
'pour appeler l'instance en cours ou en creer une 
 
la_classe = getinstance()
 
%>
Si vous avez d'autres exemples, je reste preneur :p
freneticc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 09h46   #6
Modérateur
 
Avatar de roro06
 
Inscription : avril 2007
Messages : 1 364
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : avril 2007
Messages : 1 364
Points : 1 551
Points : 1 551
bonjour

Ca va pas changer grand chose : le probleme, c'est que ton instance déclarée comme cela aura la même durée de vie que la page dans laquelle elle est appelée. Si tu va sur une autre page, cette instance n'existera plus. Ton test est donc inutile, il suffit de faire en début de page :
Code :
Set la_classe = New maclasse
et c'est joué
Or, si j'ai bien compris ton besoin, tu veux une instance de ta classe qui dure tout le temps de l'Application (la durée de vie de l'Application part à partir du tout premier appel d'une page du site jusqu'a l'arret du serveur).


Pour une variable de type texte, pas de probleme : il suffit de déclarer une variable d'Application (ça porte bien son nom, hein ?) de la manière suivante :

Application ("maVariable") = "monContenu"

Pour une instance de classe ... ça passe pas. vbScript n'est pas un langage orienté Objet.

(Au passage, et si ce n'est pas trop tard, si tu doit faire un site ASP "orienté objet", je te conseille de plutot utiliser Jscript. Ca ne résoudra rien, mais le langage est tellement plus riche et plus souple ...) . Tout l'interet de .net (sur lequel je ne pourrais pas t'aider ! ) est là.

(Entre nous, il aurait suffit que Microsoft veuille bien rajouter à son objet Application cette possibilité, on aurait gagné beaucoup)
roro06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 11h15   #7
Membre confirmé
 
Avatar de Cpas2latarte
 
Inscription : janvier 2006
Messages : 238
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 238
Points : 217
Points : 217
Grosso modo Il est demandé de "stocker" une instance d'un objet VBS dans toute la durée d'une application -> stoké dans la vériable d'application.

J'ai fait un fonctionnement de ce type, j'ai rencontré les mêmes limitation.
J'ai contourné le problème en simulant une sérialisation de mon objet.
Je m'explique :
plutôt que de faire un
Code :
1
2
 
Set Application("...) = monobjet
J'ai ajouté 2 méthodes a mon objets
la premiere recupérait l'ensemble des propriétés de mon objet, et retourné une chaine du type propriété=valeur
quelque chose du genre
propriete1=valeur1&propriete2=valeur2&.....&proprieten=valeurn

La seconde méthode à partir d'une chaine de ce type, rensignait les propriété adéquate de la class.

du coup quand je voulais sauvegarder mon objet, je sauvegardait en fait une chaine correspondant au contexte de mon objet.
Code :
1
2
 
Application("...") = monObjet.serialise()
et je récupérais mon objet de la sorte :
Code :
1
2
3
 
Set monObjet = new MaClass
call monObjet.unserialise(Application("..."))
dans le cadre de l'utilisation que j'en faisait, ça marchait plutôt bien. Juste 2 inconvénient :
- quand on modifie la CLass (ajout, suppression de propriété) il faut penser à modifier les 2 méthodes
- je ne stockait que des variant (pas de references sur des objet de type activex par example)

J'espere que ça peut t'aider
__________________
Il n'y a que 2 choses infinies dans le monde :
L'univers et la bétise humaine...
Mais pour l'univers, je n'ai pas de certitude (A.E.)
Cpas2latarte est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2007, 11h55   #8
Modérateur
 
Avatar de roro06
 
Inscription : avril 2007
Messages : 1 364
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : avril 2007
Messages : 1 364
Points : 1 551
Points : 1 551
Pas con du tout, comme idée ... C'est peut-être LA solution à adopter
roro06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2007, 10h11   #9
Invité de passage
 
Inscription : août 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 5
Points : 0
Points : 0
Merci beaucoup à vous 2 pour les explications

Tout d'abord, pour le moment, je pense que je n'aurais pas besoin de stocker durant toute la durée de l'application, mais uniquement lors de l'execution du script.

Ceci dans le but de ne pas avoir a recreer un objet à chaque fois que j'utilise une fonction, ou bien même de lui transmettre en paramètre à chaque fois.
Pour le moment donc, mon histoire avec la fonction getinstance() fonctionne bien.

Par contre l'interet de stocker un objet durant toute l'application me parait un petit peu bizzarre.. je ne vois pas trop l'interet, a part si vous n'avez pas de BDD derrière.

Sinon l'idée de serialiser est pas mal , mais tu utilises un séparateur pour serialiser, et si tu as une variable dans ton objet de type texte, ca peut etre dangereux.
De meme qu'avec une serialisation, tu ne fais que stocker les attributs de ton objets, et non pas les méthodes, ce qui revient a utiliser les variables de session je pense...

En tout cas merci à vous
freneticc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2007, 10h41   #10
Membre confirmé
 
Avatar de Cpas2latarte
 
Inscription : janvier 2006
Messages : 238
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 238
Points : 217
Points : 217
Citation:
Envoyé par freneticc Voir le message
mais tu utilises un séparateur pour serialiser, et si tu as une variable dans ton objet de type texte, ca peut etre dangereux.
Dans la méthode de sérialisation j'avais prévus un principe d'échappement. En l'occurrence, je ne m'étais pas trop embêté, j'avais utilisé le même format que dans un fichier CSV (pourquoi réinventer la roue ...)
ex valeur1="toto";
et si ma chaine contenait 1 guillemet, je le doublais.
Ce qui m'avais poser le plus de problème c'était la désérialisation.

Citation:
Envoyé par freneticc Voir le message
De meme qu'avec une serialisation, tu ne fais que stocker les attributs de ton
C'est exactement le but d'une sérialisation : stoker le contexte (la valeurs des propriétés) et non l'objet lui même.
l'avantage de la sérialisation c'est qu'on peut l'utiliser dans de nombraux cas (sauvegarde dans un fichier, transfert vias socket etc...)

Mais il est vrais qu'on s'égare du sujet "SINGLETON"
Je ne sais pas ce que c'est qu'un SINGLETON, j'ai regarde sur wikipedia.
D'après ce que j'en ai compris, a ma connaisance tu n'a pas cela en ASP, en revanche, un fonctionnement de type SINGLETON entièrement gérer par le sytème peut être utilisé

Cela nécéssite de déporter toute la logique métier dans des dll active x.
Ces dll doivent être développé en l'implémentant une interface (je ne sais plus le nom ) qui permet la prise en charge de la DLL via le service window MSMQ.
lorceque tu install la (les) DLL et que tu la (les) paramètre(s) dans le service de composant de windows, le sytem "le prend en charge"
a chaque fois que tu fait un createobject dans asp -> le système vérifie si il existe une instance de l'objet en mémoire, si oui, il sauvegarde le contexte de l'objet, et a allou un nouveau contexte qu'i n'est accessible que pour celui quie a fait le CreateObject.
C'est complètement transparent pour le développeurs web et ça permet une bien meilleur monte en charge du serveur et une économies des ressource du serveur.
Est ce que ça correspond a ce qui est demandé ?
__________________
Il n'y a que 2 choses infinies dans le monde :
L'univers et la bétise humaine...
Mais pour l'univers, je n'ai pas de certitude (A.E.)
Cpas2latarte est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2007, 11h03   #11
Invité de passage
 
Inscription : août 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 5
Points : 0
Points : 0


Oui ca m'a l'air d'etre exactement ca qu'il doit falloir faire...déporter l'objet dans des dll active x.. Maintenant je sais pas si j'aurai l'occasion et le temps de le faire
si j'y arrive, j'hésiterai pas a repasser pour vous tenir au courant
freneticc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h50.


 
 
 
 
Partenaires

Hébergement Web