c# - template - ¿Cómo funcionan los patrones singleton en un contexto web?
singleton template c# (4)
Entonces, un objeto que usa el patrón singleton solo puede tener una instancia. ¿Cómo funciona esto en los sitios web?
Preguntas:
- ¿El objeto singleton es único para cada cliente / visitante del sitio web? es decir, ¿los objetos singleton obtienen un cliente PER de instancia?
- Los objetos en las aplicaciones web solo duran unos segundos, de modo que si dos clientes acceden simultáneamente a un sitio web, ambos clientes intentarían crear un objeto singleton. ¿Significa esto que se lanzará una excepción que los visitantes verán? Intenté buscar en Google, pero no pude encontrar una respuesta directa. Solo estoy buscando una pequeña aclaración.
Bueno, para el registrador y los recursos compartidos, podemos usar singleton en aplicaciones web con seguridad ... Y como mencionó Liam, permanecen mientras el grupo de aplicaciones no se borre.
Para una mejor comprensión, visite ... http: //www.oodesign.com/singleton-pattern.html
Gracias
Singleton es mantenido por IIS, por lo que el singleton solo dura tanto como el grupo de aplicaciones de IIS. Una vez que esto se recicla o se restablece IIS, el singleton desaparece. Deberá bloquear el singleton para acceso múltiple. Como lo haría en cualquier otra aplicación de servidor de cliente.
En general, trataría de evitarlo ya que está en contra de la idea de que un sitio web sea esencialmente una aplicación de servidor de cliente sin estado. ¿Por qué no simplemente usar Session para almacenar cualquier información compartida?
Steve, intentaré responder cada una de tus preguntas:
1) Para el desarrollo web es muy común tener objetos en el alcance de la solicitud web (a veces esto también se conoce como "por contexto de solicitud" o "por contexto HTTP"), pero normalmente no nos referimos a estos como únicos para esa razón exacta. De hecho, la mayoría de los contenedores del COI tienen un alcance de "solicitud por web" integrado de fábrica, así como un "singleton".
2) Es común que a veces también tengan verdaderos singletons para una aplicación web (a los que acceden todas las solicitudes). Como se mencionó anteriormente, esto no es completamente cierto, ya que tendrá un alcance en el grupo de aplicaciones y se desvanecerá cuando / si se reinicie el grupo de aplicaciones. Pero este es un singleton para los propósitos de la aplicación web. Como mencionó Jigar, algunas veces las "preocupaciones transversales" como el registro, etc. se configuran de esta manera. Normalmente, estos no se inicializan en cada solicitud web, sino que en el archivo global.asax o al confiar en un contenedor IOC para que lo haga por usted. Solo debe asegurarse de realizar creación de objetos para utilizar uno de los patrones de bloqueo estándar para evitar que dos hilos / clientes / etc ... creen el objeto simultáneamente. Aquí hay un enlace de Microsoft, pero también hay otras implementaciones disponibles: http://msdn.microsoft.com/en-us/library/ff650316.aspx Si está utilizando uno de los populares contenedores de COI, se encargará de esto. para usted (Structuremap, Windsor, Autofac, Unity, Ninject ... y muchos otros).
Debería preguntarles a sus compañeros de trabajo a qué enfoque se refieren porque ambos son válidos en ciertas situaciones y muy comunes.
Todo depende de su implementación singleton. Aquí supongo que crea singletons como campos estáticos inicializados en constructores estáticos.
Teóricamente, dependiendo de su configuración, IIS puede crear varios procesos para su aplicación, y cada proceso puede crear varios subprocesos para procesar solicitudes. Cada proceso tendría sus propios singletons, que pueden ser compartidos por varios hilos (y varias solicitudes). Pero al mismo tiempo, puede haber varias instancias de "singletons" (una para cada proceso) en un servidor (pero, si entiendo correctamente, se pueden prohibir varios procesos en la configuración de IIS).
Si usa constructores estáticos, entonces se crearán singletons en el primer acceso a su clase de una manera segura para subprocesos. Consulte ¿Es seguro el hilo del constructor estático de C #?
Pero aunque la creación singleton es segura para subprocesos, aún debe implementar el interior de su clase singleton de una manera segura para subprocesos.
Singletons viviría mientras el proceso de solicitud viva y no se reinicie. La vida útil del proceso de solicitud es administrada por IIS, por lo que puede ser un tiempo prolongado o muy corto.