2010-08-12 19 views
6

Soy autohospeda de un servicio WCF en un cliente de WPF. Quiero mostrar los datos que el servicio recibe en la interfaz de usuario. Cada vez que se reciben datos, la interfaz de usuario debe actualizarse.Servicio WCF autohospedado: ¿Cómo acceder a los objetos que implementan el contrato de servicio desde la aplicación de alojamiento?

El código en "App.xaml.cs" parece

private ServiceHost _host = new ServiceHost(typeof(MyService)); 

    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     _host.Open(); 
    } 

    private void Application_Exit(object sender, ExitEventArgs e) 
    { 
     _host.Close(); 
    } 

¿Cómo puedo obtener la instancia (s) objeto que implementa el contrato de servicio de la aplicación WPF hosting?


Gracias a todos por las respuestas.

Lo que no vi fue que el constructor de ServiceHost permite pasar un ejemplo del servicio en lugar de su tipo.

Así que lo que hago ahora es:

  • utilizar un ObservableCollection en la implementación del servicio
  • configurar el servicio para ser un producto único (ver el comentario de theburningmonk)
  • se unen al ObservableCollection en mi aplicación WPF
  • Obtenga una instancia del servicio utilizando la propiedad de enlace de datos DataContext
  • Páselo al constructor de ServiceHost

Resultado: cada actualización en el servicio WCF singleton se refleja en la interfaz de usuario.

¡Feliz!

+0

Tienes la clase (MyService). Creo que quieres decir: cómo obtener las instancias del objeto. –

+0

Gracias, eso es correcto, he cambiado la pregunta. – Robert

Respuesta

12

Como dijo marc_s, está creando un servicio WCF PerCall/PerSession y se crea una nueva instancia en cada solicitud/primera solicitud de cada sesión.

Puede construir algunas tuberías para que la instancia pueda notificar al servidor del servicio cuando recibe una nueva solicitud, pero no será un ejercicio fácil y debe tener en cuenta la posibilidad de pérdida de memoria si decide para usar eventos para hacer esto - sin implementar el Patrón de Evento Débil sus instancias de servicio WCF podrían quedar suspendidas ya que los manejadores de eventos todavía tienen una referencia a ellos A MENOS QUE recuerde notificar al host para darse de baja cuando las instancias del servicio WCF sean eliminadas .

En cambio, aquí hay dos ideas que podrían hacer que sea más fácil para usted para lograr su objetivo:

Utilice la individualInstanceContextMode si su servicio se puede hacer un producto único, en cuyo caso se creará una nueva instancia que implementa su contrato de servicio y de acogida:

// instance will be your WCF service instance 
private ServiceHost _host = new ServiceHost(instance); 

de esa manera usted tendrá acceso a la instancia que va a recuperar las peticiones de los clientes.

Alternativamente, usted podría tener todos los casos sean alojados ficticias '' fascades que comparten una clase estática que realmente procesar las solicitudes:

[ServiceContract] 
interface IMyService { ... } 

interface IMyServiceFascade : IMyService { ... } 

// dummy fascade 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall] 
public class MyServiceFascade : IMyServiceFascade 
{ 
    private static IMyService _serviceInstance = new MyService(); 

    public static IMyService ServiceInstance { get { return _serviceInstance; } } 

    public int MyMethod() 
    { 
     return _serviceInstance.MyMethod(); 
    } 
    ... 
} 

// the logic class that does the work 
public class MyService : IMyService { ... } 

// then host the fascade 
var host = new ServiceHost(typeof(MyServiceFascade)); 

// but you can still access the actual service class 
var serviceInstance = MyServiceFascade.ServiceInstance; 

yo diría que hay que ir con el primer enfoque, si es posible, hace la vida un poco más fácil!

+0

Gracias, excelente comentario, me señaló en la dirección correcta. – Robert

+0

¡No es un problema hombre, contento de ser de ayuda! – theburningmonk

1

No hay una sola instancia de objeto de tipo MyService que esté disponible; de ​​manera predeterminada, WCF usa un modelo por llamada, p. Ej. para cada solicitud que entre, se creará una nueva instancia de MyService, que se usará para manejar esa solicitud, y luego se liberará.

Por lo tanto, a menos que haya al menos una solicitud en ejecución, lo más probable es que no haya ninguna instancia del servicio.

¿Qué es exactamente lo que quiere lograr con esto? Quizás necesite replantearse su enfoque y pasar de la instancia de la clase de servicio: tiene una propiedad .Host que enlaza con el host que aloja esa instancia de servicio particular.

Cuestiones relacionadas