2011-04-11 5 views
0

--ConsoleApplication 1problème de mise en œuvre singleton en C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication2 
{ 
    public class MsgService 
    { 
     private static CreateConnectionToA _instanceA; 
     private static CreateConnectionToB _instanceB; 

     protected MsgService() 
     { 

     } 

     public static MsgService GetInstanceA(string paramA, string paramB) 
     { 

      if (_instanceA != null) 
      { 
       return _instanceA; 
      } 

      return _instanceA = new CreateConnectionToA("p1","p2"); 
     } 


     public static MsgService GetInstanceB(string paramA, string paramB) 
     { 

      if (_instanceB != null) 
      { 
       return _instanceB; 
      } 

      return _instanceB = new CreateConnectionToB("p1", "p2"); 
     } 


    } 




} 


using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication2 
{ 
    class CreateConnectionToB : MsgService 
    { 
     public CreateConnectionToB(string param1, string Param2) 
     { 

     } 
    } 
} 


using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication2 
{ 
    class CreateConnectionToA : MsgService 
    { 
     public CreateConnectionToA(string param1, string Param2) 
     { 

     } 

    } 
} 


using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      MsgService.GetInstanceA("p1", "p2"); 

      Console.Read(); 
     } 
    } 
} 

--ConsoleApplication 2

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Press"); 
      Console.Read(); 

      ConsoleApplication2.MsgService.GetInstanceA("p1", "p2"); 
      Console.Read(); 
     } 
    } 
} 

Je suis en train de faire la mise en œuvre de simgleton mais quelque chose ne va pas avec mon approche. Il crée toujours une nouvelle instance de _instanceA et _instanceB à partir de chaque application de console. Est-ce que quelqu'un peut me signaler ce qui doit être fait ici?

Répondre

3

Vous auriez besoin de Mutex nommés pour la synchronisation inter-processus.

+1

vers le haut, eh oui. Si nous ne sommes pas contraints par les choix de mise en œuvre, et que nous essayons simplement de réaliser un service à distance qui se comporte comme un singleton, je suggère fortement d'examiner la WCF (qui a la capacité de le faire). –

+0

Pouvez-vous s'il vous plaît me montrer un exemple? – Asdfg

+0

+1 pour l'utilisation de la synchronisation par transmission de messages. – GregC

0

Le partage d'une instance d'objet entre deux applications est assez difficile, car elles s'exécutent dans des domaines d'application distincts, par défaut. Pour accomplir ce que je pense que vous essayez de faire, vous devrez soit

  • maréchal à travers les frontières AppDomain avec ou
  • exécuter les deux processus dans un appdomain partagé. Ecrire un 3ème processus — un shell — qui est responsable de la génération/hébergement des deux autres processus dans un domaine d'application partagé.

http://www.codeproject.com/KB/dotnet/AppDomainMemImprovement.aspx

Sharing data between AppDomains