CrossAppDomain контейнер
От: Smirnov.Anton Россия  
Дата: 08.05.09 08:35
Оценка:
Есть некое приложение.
В приложении присутствует такое понятие, как сервис.
В приложении может быть создано несколько AppDomain'ов.
К сервисам доступ может осуществляться различными способами:
как осуществить 1,2 и 4 ясно.
Как поступить с кроссдоменными — не совсем понятно
Хочется по аналогии с 1 и 2, через контейнер сервисов.
То есть, в результате необходим контейнер, к которому есть доступ из всех доменов приложения.
Как это сделать... в голову приходят несколько вариантов, каждый из которых не до конца нравится:

вообще более интереснен подход #3, так как не очень хочется централизовывать
остаётся вот вопрос, как получить все домены приложения.
видится примерно такой подход(для данной конретной ситуации)
получить через рефлекшн метод класса AppDomain
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern AppDomain GetDefaultDomain();

и дефолтный домен с его GetData и SetData использовать в качестве хранения расшаренных данных



по поиску нашлись:
http://www.rsdn.ru/forum/message/521840.flat.aspx
Автор: AndrewVK
Дата: 28.01.04
appdomain shared data
Re: CrossAppDomain контейнер
От: HowardLovekraft  
Дата: 08.05.09 08:43
Оценка:
Здравствуйте, Smirnov.Anton, Вы писали:

SA>К сервисам доступ может осуществляться различными способами:

SA> SA>как осуществить 1,2 и 4 ясно.
SA>Как поступить с кроссдоменными — не совсем понятно
3 — это то же самое, что и 4. Отличние — домены находятся в разных процессах.
Я бы вообще не стал различать эти случаи — просто опубликовал бы контейнер сервисов и единообразно обращался к нему отовсюду, при необходимости меняя физику канала связи.
Re[2]: CrossAppDomain контейнер
От: Smirnov.Anton Россия  
Дата: 08.05.09 08:58
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, Smirnov.Anton, Вы писали:


SA>>К сервисам доступ может осуществляться различными способами:

SA>> SA>>как осуществить 1,2 и 4 ясно.
SA>>Как поступить с кроссдоменными — не совсем понятно
HL>3 — это то же самое, что и 4. Отличние — домены находятся в разных процессах.
HL>Я бы вообще не стал различать эти случаи — просто опубликовал бы контейнер сервисов и единообразно обращался к нему отовсюду, при необходимости меняя физику канала связи.

в принице оно так, всё это Remoting
только вот:
изначально проектировалось только для классического ремоутинга (ipc, tcp, ...)
есть общий некое ядро, в котором хранятся адреса, на которых опубликованы экземпляры сервисов, хранятся только host+port (для IPC адрес получается ipc://[host]:port/)
uri сервиса получается из его описания(аттрибута интерфейса)
таким образом:
при старте сервиса он прописывает свой адрес в этом ядре
при активации сервиса — получается адрес сервиса из ядра, формируется url, поднимается если нужно требуемый канал, активируется
очень уж не хочется ChannelData от CrossAppDomain хранить в ядре, или что ещё хуже — его objref
Re[3]: CrossAppDomain контейнер
От: HowardLovekraft  
Дата: 08.05.09 10:27
Оценка:
Здравствуйте, Smirnov.Anton, Вы писали:

SA>изначально проектировалось только для классического ремоутинга (ipc, tcp, ...)

Что такое не-классический ремоутинг?

Я правильно понял, что в каждом домене может быть создано N сервисов, и к каждому из этих сервисов может обращаться различное число клиентов из различных доменов/процессов?
Re[4]: CrossAppDomain контейнер
От: Smirnov.Anton Россия  
Дата: 08.05.09 10:59
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, Smirnov.Anton, Вы писали:


SA>>изначально проектировалось только для классического ремоутинга (ipc, tcp, ...)

HL>Что такое не-классический ремоутинг?
надо было в кавычки поставить
просто кроссдоменный ремоутинг вес спрятан внутри с учётом того, что он будет использоваться автоматически при CrossAppDomainCallback или AppDomain.CreateObjectAndUnwrap
а каналы c IPC, TCP, ... открыты так что ими можно пользоваться и настраивать в отрытую
согласен что неудачный термин
неклассическим его назвал, так как добираюсь до сервисов сейчас через
RemotingServices.Connect(type, url, channeldata)
конечно с url аля
/bf6ef9f4_1693_42d1_a1d9_fe698dbbc03d/qamkyau2eusvk0vumndifxv_20.rem
тоже пройдёт, только вот хранить его негде
это конечно можно устроить, только вот ничего хорошего имхо не получится в любом случае
придерживаюсь мнения, что всё же кроссдомен больше похож на кроссконтекст или прямое взаимодействие, чем на кросспроцессное

HL>Я правильно понял, что в каждом домене может быть создано N сервисов, и к каждому из этих сервисов может обращаться различное число клиентов из различных доменов/процессов?

да, верно
Re[5]: CrossAppDomain контейнер
От: HowardLovekraft  
Дата: 08.05.09 11:36
Оценка:
Здравствуйте, Smirnov.Anton, Вы писали:

SA>придерживаюсь мнения, что всё же кроссдомен больше похож на кроссконтекст или прямое взаимодействие, чем на кросспроцессное

Вам нужно абстрагировать клиентов от того, где находится конкретный сервис. Напрашивается Service Locator.
Re[6]: CrossAppDomain контейнер
От: Smirnov.Anton Россия  
Дата: 08.05.09 14:22
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, Smirnov.Anton, Вы писали:


SA>>придерживаюсь мнения, что всё же кроссдомен больше похож на кроссконтекст или прямое взаимодействие, чем на кросспроцессное

HL>Вам нужно абстрагировать клиентов от того, где находится конкретный сервис. Напрашивается Service Locator.
я этим и занимаюсь в данный момент
попросил совета, как быть с кроссдоменом
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.