Pregunta

¿Hay una manera de compartir de manera eficiente o mover objetos .NET a través de dominios de aplicación? Soy consciente de que la intención de dominios de aplicación es el de proporcionar aislamiento - sin embargo tengo un caso en el que necesito para mover un conjunto relativamente grande, en caché de objetos inmutables que son caros para calcular y crear. Por el momento, tengo un enfoque de serialización que funciona, pero es bastante lento.

¿Fue útil?

Solución

No se puede mover un objeto a través de un dominio de aplicación sin serializar ella. Ese es el punto principal de un dominio de aplicación -. Casi se puede pensar que es un proceso completamente separado

Aquí es donde entra en juego MarshallByRefObject. Que le permite uso el objeto desde el otro dominio de aplicación mediante comunicación remota, sin tener que serializarlo a través del límite dominio de aplicación. Todavía se está trabajando a través de la interacción remota, por lo que será más lenta que mantiene el objeto en el mismo dominio de aplicación, pero si el objeto es grande y está utilizando con poca frecuencia, esto puede ahorrar una enorme cantidad de tiempo en comparación con la serialización y revertir la seriación para hacer una nueva copia en el segundo dominio de aplicación.

Otros consejos

Una cosa que puedes intentar es derivar sus objetos de MarshalByRefObject. Por defecto, los objetos son formateados por valor a través de dominios de aplicación. Para los objetos que se derivan de MarshalByRefObject, la persona que llama se le da un proxy para el objeto. Todas las llamadas pasan por el proxy y luego se marshalled aplicación al dominio del objeto. Esto puede reducir la necesidad de crear copias de todos sus objetos en ambos dominios de aplicaciones.

¿Qué hay de la creación de un espacio de aplicación separada para la gestión de objetos compartidos y luego ya sea utilizando servicios web o de interacción remota para obtener / conjuntos de datos compartidos? Se podría absoluto se refiere a crear un centro en memoria (dependiendo de cómo se almacenan los datos) repositorio.

Creo que sólo unos pocos objetos 'bendita' son capaces de 'Marshal de aireación' es decir, dejar que la deriva a través de las fronteras (cuerdas siendo uno)

Conexión remota las llamadas debería funcionar si son gruesos en lugar de intentar copiar todo el asunto a través de (una gran pérdida de memoria si no otra cosa)

.NET Remoting es el mejor método que conozco, aunque no tengo experiencia bastante limitada. Si desea utilizar este necesita leer Avanzado .NET Remoting, segunda edición de Ingo Pisón y Mario Szpuszta. Al iniciar buscando en Google el nombre de .NET Remoting Ingo aparece con frecuencia. He encontrado que el libro sea un poco anticuado, pero muy valioso. Yo no lo he probado con grandes objetos binarios serializados aún, pero parece eficaz con los objetos más pequeños que he estado trabajando. Lo que encontrar no se puede tener objetos con propiedades SecureString, a menos que se desea implementar serialización personalizada / deserialización para ellos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top