2009-01-09 10 views

Respuesta

23

En lugar de preocuparse por deshacerse de sus servicios web, puede guardar solo una instancia de cada servicio web, usando singleton pattern. Los servicios web son apátridas, por lo que se pueden compartir de forma segura entre conexiones y subprocesos en un servidor web.

Aquí hay un ejemplo de una clase de servicio web que puede usar para contener referencias a las instancias de su servicio web. Este singleton es flojo y seguro para subprocesos. Se recomienda que si haces que tus singletons sean flojos, también se mantengan seguros para hilos siguiendo la misma lógica. Para obtener más información acerca de cómo hacer esto, lea el artículo C# In Depth en Implementing Singletons.

Además, tenga en cuenta que puede tener problemas con los servicios web de WCF. Recomiendo leer en WCF's instance management techniques article, específicamente en la sección singleton, para más detalles.

public static class WS 
{ 
    private static object sync = new object(); 
    private static MyWebService _MyWebServiceInstance; 

    public static MyWebService MyWebServiceInstance 
    { 
     get 
     { 
      lock (sync) 
      { 
       if (_MyWebServiceInstance == null) 
       { 
        _MyWebServiceInstance= new MyWebService(); 
       } 
      } 
      return _MyWebServiceInstance; 
     } 
    } 
} 

Y luego cuando se necesita acceder a su servicio web, usted puede hacer esto:

WS.MyWebServiceInstance.MyMethod(...) 

o

var ws = WS.MyWebServiceInstance; 
ws.MyMethod(...) 

he utilizado con éxito este patrón en varios proyectos y se ha funcionado bien, pero como tvanfosson menciona en los comentarios a continuación, una estrategia aún mejor sería usar un marco DI para administrar sus instancias de servicios web.

+0

Gracias! Definitivamente implementaré un uso ahora. – BeaverProj

+0

@DanHerbert, tenemos control de revisión de su pregunta públicamente disponible ... por lo que no necesita saturar su publicación con un montón de cosas tachadas. Está distrayendo – mmcdole

+0

¿Puede escribirnos un libro entero sobre esto? estás casi allí ... – Jobo

1

Creo que DataService hereda Dispose from Component.

0

¿Qué estás tratando de lograr aquí?

Si le preocupa el rendimiento, me preocuparía más la capacidad de respuesta del servidor que aloja el servicio web y la velocidad de la red, ya que pueden afectar drásticamente el tiempo que tiene que esperar para completar la llamada al servicio web (a menos es asincrónico). Los ejemplos en MSDN no llaman 'Dispose' y es bastante obvio que el recolector de basura hará su trabajo, así que a menos que trabaje en un sistema en tiempo real que necesita procesar más de 100,000 registros en memoria cada segundo, entonces tal vez no necesidad de encontrar una forma de disponer de los recursos o administrar la memoria.

+0

Mi pregunta era más de un * should * lo hace punto de vista como apposed a un do you have to do it punto de vista. Mi principal preocupación es la pérdida de memoria, que degradaría lentamente el rendimiento a lo largo del tiempo. – BeaverProj

1

Los objetos que implementen IDispose se deben eliminar manualmente para ayudar al recolector de basura.

Si su objeto es efímero, utilice un bloque using. Para los objetos que se pueden conservar, asegúrese de que el objeto que los retiene se deshaga de ellos cuando también se eliminan.

Cuestiones relacionadas