2008-11-24 16 views
35

Tengo una aplicación que necesita enviar un volumen moderadamente alto de mensajes entre varios AppDomains. Sé que podría implementar esto usando la comunicación remota, pero también he notado que hay delegados entre dominios. ¿Alguien ha visto este tipo de problema?¿Cuál es la mejor manera de comunicarse entre los AppDomains?

+0

WCF utilizando canalizaciones con nombre se parece el favorito para mí - puedo entonces por lo menos evitar la necesidad de ir a la red. ¡Gracias a todos! –

+0

¿Te gustaría elaborar sobre esta técnica? por ejemplo, ¿cuál es el costo de rendimiento de usar canalizaciones con nombre y la facilidad de uso en comparación con AppDomains y MBRO (MarshalByRefObject). –

+0

No tengo cifras a mano, pero el uso de un serializador binario y tuberías con nombre me ha permitido comunicarme casi sin problemas entre los dominios. Se me ocurrió un simple bus de mensajes y he podido ignorar el problema desde entonces. –

Respuesta

25

he tenido buen éxito utilizando WCF con un nombre tuberías de unión. El uso de conductos con nombre no crea tráfico de red y utiliza codificación binaria, por lo que debe ser bastante rápido sin sacrificar la capacidad de distribución en escenarios de escalado futuros.

EDITAR: Consulte here para obtener información más detallada, incluido un enlace a un ejemplo de implementación.

3

Esto es sólo una idea rápida, pero escuché que incluso para la comunicación entre dominios WCF sería el enfoque recomendado, comenzando desde .NET 3.0 por supuesto. En realidad, esto tiene sentido, ya que la comunicación remota es solo otra tecnología envuelta por WCF.

12

A-dominios delegado sólo permite un método vacío con parámetros de cero, y no es probablemente lo que usted piensa que es. Es apenas útil como una devolución de llamada simple para fines de notificación de un dominio a otro, p. Ej. un método como InitComplete() o algo así.

Remoting es la única opción, llámese WCF o cualquier otra cosa, que pasa tipos serializables, o el uso de MBRO tipos (MarshalByRefObjects). No es tan difícil como crees

-Oisin

+0

Remoting sound .NET 1.1 para mí.¿Hay alguna alternativa más nueva para hacer comunicación entre dominios cruzados? –

+0

Remoting nunca desapareció. Todavía se usa en todas partes. La modernation de WCF vino para llamadas de proceso cruzado (IPC). Pero para aplicaciones, siempre ha sido remoto. Puede usar WCF con canalizaciones con nombre, pero meh. Remoting es menos complicado IMO. – x0n

+1

@ x0n, [Remoting es] una tecnología heredada que se conserva para compatibilidad con versiones anteriores con aplicaciones existentes y no se recomienda para un nuevo desarrollo. Las aplicaciones distribuidas ahora deben desarrollarse utilizando Windows Communication Foundation (WCF). http://msdn.microsoft.com/library/72x4h507.aspx – Guillaume

9

acabo de descubrir que es posible que también utiliza el AppDomain.SetData pero esto es sólo una manera Desde el host de dominio a dominio secundario.

static void RunInChildDomain() 
{ 
    AppDomain childDomain = AppDomain.CreateDomain("friendlyName"); 
    string parameterValue = "notmii"; 
    childDomain.SetData("parameter", parameterValue); 
    childDomain.DoCallBack(PrintName); 
} 

static void PrintName() 
{ 
    string Name = Convert.ToString(AppDomain.CurrentDomain.GetData("parameter")); 
    Console.WriteLine(Name); 
} 

También puede crear una comunicación impulsada excepción entre el niño y el dominio de aplicación host usando evento AppDomain.FirstChanceException :)

1

Quiero ampliar sobre la respuesta de xActivar. Se recomienda el uso de cualquiera de WCF o MarshalByRefObject, pero dado que la pregunta se refiere a la comunicación entre dominios de aplicación, y no acerca de la comunicación entre procesos, creo que el enfoque MBRO es significativamente más sencillo de implementar, y por lo tanto es la respuesta correcta.

Cuando estaba investigando este problema yo mismo, al principio me costó entender cómo el niño AppDomain podía comunicarse con el padre, hasta que me di cuenta de que podía pasarle un mango a un objeto MBRO en el niño, y el niño podría entonces desenvuelva ese asa para comunicarse de nuevo con el padre (o cualquier otro dominio de la aplicación). Publiqué una solución a mi propia pregunta here.

Posteriormente supe que se puede definir una interfaz, poner en práctica esa interfaz en una clase compleja, y luego pasar a un mango sólo la interfaz. Esto puede reducir en gran medida la cantidad de ensamblajes que pueden requerirse para cargar el AppDomain hijo.

Cuestiones relacionadas