2010-01-18 3 views
1

Хорошо. У меня есть ситуация, когда C# .dll является синглом. Теперь то, что я хочу сделать, - это когда экземпляр singletonInstance будет создан, чтобы предоставить ссылку на любые другие приложения, которые могут начаться. Итак, я искал NamedPipes, и это сработает - за исключением одного, это должно быть кросс-платформенным или независимым от платформы. У меня есть решение в виду, но мне трудно найти, может ли я получить ссылку на singletonInstance либо через дескриптор, либо какой-либо другой метод?Singleton Ссылка

Теперь, когда было несколько комментариев и вопросов, я могу объяснить немного больше и уточнить: у меня есть в основном общедоступный ресурс (мой singletonInstance.dll). Скажем, appA нуждается в том, что singletonInstance, если он еще не установлен, это будет его экземпляр. Затем запускается appB, и ему нужна ссылка на singletonInstance. Это сценарий.

+1

Вы работаете в .NET. Все, что предусмотрено каркасом, является кросс-платформенным для ваших целей. –

+2

Мне интересно * почему * вы хотели бы это сделать. –

+0

Название «singletonInstance» - это запах кода для меня. – Tom

ответ

2

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

+0

Я думал, что Remoting (см. Мой ответ ниже) будет ответом. Но это действительно лучший способ начать. Мы рассматриваем наши варианты, в том числе Tcp Sockets, и реализуем protobuf-net. – IAbstract

0

Ну, вы можете общаться через именованные каналы, и когда они недоступны, вы можете пойти в сокеты, но это зависит от того, что на самом деле будет делать ваш «синглтон». Это какой-то общий кэш? Или что?

Отделит приложения и «singleton» от работы на одном компьютере или в сети? Подход Anyways socket хорош, если вы хотите контролировать реализацию на низком уровне, или вы можете перейти на веб-службы с некоторыми накладными расходами или использовать удаленный доступ.

+0

Теперь я работаю с доменами процессов/приложений, чтобы «найти» экземпляр .dll, а затем MarshalByRefObject - включить мою ссылку через функцию InstanceAndUnwrap(). Как получится. – IAbstract

0

Я предложу ответ - Runtime.Remoting.Channels. У меня был общий объект данных («singletonInstance»), наследующий MarshaByRefObject. Это дает нам именно то, что мы хотим, плюс мы делаем его способным к некоторым сетевым функциям. Сейчас это действительно действует как услуга. Сервер TcpChannel 'Server' фактически является частью DLL, где находится общий объект данных. Это в основном только для тестирования, экспериментальной реализации и т. Д.

0

Похоже, что вам лучше реализовать все, что необходимо использовать в качестве службы.

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

Служба сама может управлять своим внутренним состоянием надлежащим образом (singleton anti-patterns или иначе, это не имеет значения).

Подумайте о том, как проектируется сервер Sql. Он не использует один и тот же экземпляр dll для процессов и границ памяти, а также не использует тяжелых клиентов.

+0

@Robert: Правильно ... CommonDataObject действительно устанавливает «общий» экземпляр, где пользователи имеют отдельные рабочие области приложений или даже рабочие области рабочей группы для совместных действий. Это также попытка создать независимое от платформы решение и предоставить нам возможность реализовать наши собственные функции безопасности. – IAbstract

Смежные вопросы