проблема с реализацией синглтона в С#

--Консольное приложение 1

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();
        }
    }
}

--Консольное приложение 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();
        }
    }
}

Я пытаюсь сделать реализацию simgleton, но что-то не так с моим подходом. Он всегда создает новый экземпляр _instanceA и _instanceB из каждого консольного приложения.

Может кто-нибудь указать мне, что нужно сделать здесь?


person Asdfg    schedule 11.04.2011    source источник


Ответы (2)


Вам понадобятся именованные мьютексы для межпроцессной синхронизации.

person GregC    schedule 11.04.2011
comment
прямо, ага. если мы не ограничены выбором реализации и просто пытаемся получить удаленную службу, которая ведет себя как синглтон, я настоятельно рекомендую взглянуть на WCF (у которого есть возможность сделать это). - person johnny g; 11.04.2011
comment
yoda.arachsys.com/csharp/singleton.html Синглтон Джона Скита написан исходя из того, что он живет внутри одного процесса. Тем не менее, хорошо прочитано. - person GregC; 11.04.2011
comment
пример для именованного мьютекса, пожалуйста? - person Asdfg; 11.04.2011
comment
@Asdfg: не могли бы вы точно описать, что вы пытаетесь сделать, не используя слова singleton и word service? - person GregC; 11.04.2011
comment
Я пытаюсь создать один экземпляр _instanceA и _instanceB независимо от вызовов. Из ConsoleApplication1 он работает нормально, но из ConsoleApplication2 проверка нуля завершается ошибкой и создается новый экземпляр. Я хочу, чтобы _instanceA и _instanceB были в памяти. - person Asdfg; 11.04.2011

Совместное использование экземпляра объекта между двумя приложениями довольно сложно, поскольку по умолчанию они работают в разных доменах приложений. Чтобы выполнить то, что, как я думаю, вы пытаетесь сделать, вам нужно либо

  • маршалировать через границы домена приложения с помощью или
  • запустите два процесса в общем домене приложения. Напишите третий процесс - оболочку, которая отвечает за создание/размещение двух других процессов в общем домене приложения.

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

Обмен данными между доменами приложений

person Nicholas Carey    schedule 11.04.2011