Handle d'objet managé c# 1.1

Résolu
chental Messages postés 31 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 15 mars 2015 - 16 avril 2009 à 08:17
chental Messages postés 31 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 15 mars 2015 - 16 avril 2009 à 22:35
Bonjour à tous,


Je suis entrain de développer trois applications qui se partageront une DLL unique responsable d'accès aux données.


Cette DLL contient une propriété : User_Connected de type booléen qui
avertit si l'utilisateur en cours est connecté ou non à la base de
données.


Ma problématique :

Lorsque je démarre une des trois applications, je me connecte à la db et je charge mon dataset.

Quand j'essaie de démarrer la deuxième ou la troisième application, je
n'arrive pas à récupérer le handle de la classe de la dll qui s'est
déjà connectée à la DB, quelqu'un aurait-il une idée pour me permettre
de pouvoir recupérer ce Handle ?

J'ai essayé avec gcnew, handleref et Gchandle, rien n'y fait.


Merci d'avance

Cordialement

6 réponses

chental Messages postés 31 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 15 mars 2015 1
16 avril 2009 à 22:35
Merci pour vos éclaircissements et conseils.


Je vais donc implémenté du remoting et reviendrai sans doute vers vous si je suis à nouveau bloqué.


En tout cas merci beaucoup de votre démarche.


Cordialement
3
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
16 avril 2009 à 14:31
Bonjour Chental,

il faut que tu utilise un "singleton", c.à.d. une classe qui n'est instanciée qu'une seule fois et qui publie son instance pour être utilisable par d'autre classes.

ex, dans la DLL qui gère les données, définition du singleton

 ///<summary>
/// Classe d'acces aux données
///</summary>
class
DataLayer
{

   public
readonly
SqlConnection Connection;

   private
string _connectionString;

   // Le constructeur est privé pour empecher toute instanciation exterieurs
   private DataLayer(
string connectionString)
   {
      _connectionString = connectionString;
      Connection =
new
SqlConnection(_connectionString);
    }

   //Méthode d'initialisation de l'instance unique
   public
static
void Initialize(
string connectionString)
   {

      if (_instance!=
null)

         throw (
new
InvalidOperationException(
"La classe DataLayer … d‚ja‡ ‚t‚ initialis‚e");
      _instance =
new
DataLayer(connectionString);
   }

   //Access à l'instance unique de l'exterieure
   private
static
DataLayer _instance =
null;

   public
static
DataLayer Instance
   {

      get 
      {

         return _instance;
      }
   }
}

Et depuis les autres applications, pour acceder à cette classe:

initialisation de l'instance
   if (
DataLayer.Instance ==
null)
      
DataLayer.Initialize(myConnectionString);

Example d'acces à un membre public du singleton:

   SqlConnection con=
DataLayer.Instance.Connection;

C# is amazing, enjoy it!
0
chental Messages postés 31 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 15 mars 2015 1
16 avril 2009 à 15:45
Merci de ta réponse claire et précise.

Cependant, j'ai déjà implementé un singleton sur la classe principale de la Dll.

En effet, il y a d'autres traitements qui se font à la connexion et qui ne doivent se faire qu'une fois.
La problématique c'est que si je fais comme tu me le dis, je n'aurais pas ces premiers traitements :
Par exemple : aller voir dans la base de registre la langue à utiliser, remonter la configuration de l'utilisateur ...
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
16 avril 2009 à 16:59
humm,
en fait j'avais mal lu l'exposé de ton probleme, je m'en excuse.
tu parles d'applications physiquement séparées, et non pas de classes differentes d'une même application.

Pour des applications tournant dans des espaces mémoire séparés il faut utiliser un model client-serveur, une premiere application se connectant à la base de donnée et agissant comme un serveur de données.

Tu peux utiliser Remoting pour communiquer avec ton mini sevrveur de données qui lui pourait être un service windows.

l'exemple que je t'ai donné ne fonctionne que si toutes les applications tournent dans un même espace mémoire.

Cdlt.
C# is amazing, enjoy it!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
chental Messages postés 31 Date d'inscription vendredi 22 août 2003 Statut Membre Dernière intervention 15 mars 2015 1
16 avril 2009 à 17:21
Ok, je comprends.

Une question me vient à l'esprit, si j'implémente un service windows, qui va démarrer le service ?
Qui va arrêter le service ?
Avec quels paramètres pour se connecter aux données ?

Dans mon cas, l'utilisateur choisit la bd à laquelle il veut se connecter et j'en distingue 4 :
FIREBIRD, SQL SERVER, ORACLE et ACCESS.
Dans la fenêtre de connexion, l'utilisateur a le choix et la classe qui implémente cette fenêtre de connexion est incluse dans ma DLL.

Comment faire ?
Ne peut - on - pas avoir un espace partagé de typa DATAAREA comme dans l'AS400?
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
16 avril 2009 à 20:33
Bonsoir,

ça fait beaucoup de questions lol.

Bon L'AS400 je ne connais pas trop, enfin il y a bien longtemps....
pour Windows le principe aujourd'hui est l'étanchéité, surtout en .net.

Mais il ne faut pas confondre "Partage de données" et "partage de code"
Pour les données c'est justement le rôle des bases de données, le registre de Windows est également à ta disposition. Pour le code c'est une autre histoire.

Un service Windows est démarré avec le système et arrêté en même temps, tu peux agir dessus via le panneau de contrôle.

Mais avec ce que tu dis, je ne pense pas que tu ais besoin de choses compliquées.
Il suffit que chacun de tes programmes fasse une connexion à la base de données, dans ce cas la classe de connexion de ta DLL sera instanciée plusieurs fois.

Tu peux stocker les préférences utilisateur ou l'historique des connexions, dans la base de registre.








C# is amazing, enjoy it!
0
Rejoignez-nous