Перемещение объектов по доменам приложений в .NET - PullRequest
1 голос
/ 11 июня 2009

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

Ответы [ 5 ]

4 голосов
/ 11 июня 2009

Вы не можете перемещать объект по домену приложения без его сериализации. В этом суть AppDomain - вы можете думать об этом как о совершенно отдельном процессе.

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

2 голосов
/ 11 июня 2009

Одна вещь, которую вы можете попробовать, это извлечь ваши объекты из MarshalByRefObject. По умолчанию объекты распределяются по значению через домены приложений. Для объектов, производных от MarshalByRefObject, вызывающей стороне предоставляется прокси для объекта. Все вызовы проходят через прокси и затем направляются в домен приложения объекта. Это может уменьшить необходимость создания копий всех ваших объектов в обоих доменах приложения.

1 голос
/ 11 июня 2009

Как насчет создания отдельного пространства приложения для управления общими объектами и последующего использования веб-служб или удаленного взаимодействия для получения / установки общих данных? По сути, вы будете создавать центральное хранилище в памяти (в зависимости от того, как вы храните данные).

0 голосов
/ 11 июня 2009

.NET Remoting - лучший из известных мне методов, хотя у меня довольно ограниченный опыт. Если вы хотите использовать это, вам нужно прочитать Advanced .NET Remoting, второе издание от Ingo Rammer и Марио Шпуста. Когда вы начинаете гуглить .NET Remoting, часто появляется имя Инго. Я нашел книгу немного устаревшей, но весьма ценной. Я еще не пробовал это с большими двоичными сериализованными объектами, но кажется эффективным с меньшими объектами, с которыми я работал. Я обнаружил, что у вас не может быть объектов со свойствами SecureString, если только вы не хотите реализовать для них пользовательскую сериализацию / десериализацию.

0 голосов
/ 11 июня 2009

Я полагаю, что только несколько "благословенных" объектов способны "Маршаллить по кровотечению", т. Е. Просто позволить дрейфовать через границы (одна строка)

Удаление вызовов должно работать, если они коренастые, а не пытаться скопировать все целиком (большая трата памяти, если ничего больше)

...