Un buen artículo para aprender sobre el alcance y el ciclo de vida del control de Autofac: el alcance del ciclo de vida es equivalente a una unidad de trabajo en tu aplicación, una unidad de trabajo inicia el alcance del ciclo de vida al principio, y luego los servicios que requieren esa unidad de trabajo se separan del ámbito del ciclo de vida.
Telescopios de por vida
Crea Oscilaciones Lifetme
Crea un telescopio manualmente y deshazlo. Los scopos de por vida son desechables y controlan la eliminación de componentes, así que asegúrate de llamar siempre a "Dispose()" o envolverlos en sentencias "using".
Ámbitos de por vida del sello
A veces puede que necesites compartir algunos servicios dentro de una unidad de trabajo, pero no quieres usar comodidades globales de compartición como el modo singleton. Por ejemplo, el ciclo de vida por solicitud de una aplicación web, en cuyo caso puedes usar InstancePerMatchingLifetimeScope para identificar tu ciclo de vida y servicio.
Por ejemplo, hay un componente que envía correo, y la lógica de la transacción necesita enviar mensajes varias veces, por lo que el servicio de correo puede compartirse en cada segmento lógico de transacción. Si no quieres que el componente de correo sea un singleton global, puedes configurarlo de la siguiente manera.
Añadir registros a un ámbito vitalicio
Autofac te permite añadir "sobre la marcha" al crear un ciclo de vida. Esto puede ayudarte cuando necesites hacer una especie de sobreescritura limitada de registro "soldadura por puntos" o si simplemente necesitas algo adicional en un alcance que no quieras registrar globalmente. Lo haces pasando un lambda a BeginLifetimeScope() que toma un ContainerBuilder y añade registros. (Al crear un ciclo de vida, registrar servicios adicionales sin registro global)
Alcance de la instancia
El alcance de la instancia determina cómo se comparte una instancia entre solicitudes. Al solicitar un servicio, autofac puede devolver un único alcance de instancia, una nueva instancia por ámbito de dependencia, o un singleton en un contexto, como un hilo o una petición HTTP por alcance de vida. Esto se aplica tanto a instancias devueltas de una llamada explícita a Resolve(), como a instancias creadas internamente por el contenedor para satisfacer las dependencias de otro componente.
- Instancia por Dependencia
- Instancia única
- Instancia por alcance de por vida
- Instancia por alcance de por vida correspondiente
- Instancia por solicitud
- Instancia por propiedad
- Alcance de Hilos
Instancia por Dependencia
También llamada 'transitoria' o 'fábrica' en otros contenedores, devuelve una instancia única cada vez que se solicita un servicio. Si no se especifica el ciclo de vida, este es el comportamiento por defecto.
Cada dependencia de Resolve devuelve un nuevo componente.
Instancia única
La misma instancia se devuelve en todas las solicitudes y ámbitos anidados.
Instancia por alcance de por vida
Este ámbito puede aplicarse a ámbitos anidados. El componente de alcance por vida tiene un máximo de una instancia dentro del ámbito anidado. Esto es útil para objetos específicos de una sola unidad de trabajo que pueden necesitar anidar unidades lógicas adicionales. Cada ámbito anidado de por vida recibirá una nueva instancia de la dependencia registrada.
Cuando analizas el componente de instancia por alcance de vida, solo hay una instancia en cada ámbito anidado (por ejemplo, por unidad de trabajo).
Instancia por alcance de por vida correspondiente
Esto es similar al Alcance de Instancia Por Vida, pero el control puede compartirse con instancias más precisas. Cuando creas un ciclo de vida anidado, puedes etiquetarlo o ponerle un nombre. Un componente con alcance por vida útil compatible tendrá como máximo una instancia única por alcance anidado que coincida con un nombre propio. Esto permite la creación de singletons con alcance, donde los ciclos anidados pueden compartir componentes sin crear instancias globales.
Útil para unidades de trabajo individuales, como peticiones http, creadas como ciclos de vida anidados. Si se crea una vida anidada por solicitud HTTP, entonces cualquier componente con alcance por vida tendrá una instancia por solicitud HTTP. (Más información sobre el alcance vitalicio por solicitud a continuación.)
En la mayoría de las aplicaciones, solo se necesita un anidamiento jerárquico de contenedores para representar una unidad de trabajo. Si se requieren múltiples niveles anidados (por ejemplo, global->solicitud->transacción), se pueden crear componentes para compartirse a un nivel específico mediante etiquetas.
Cuando se inicia un ciclo de vida anidado, las etiquetas se asocian a ese ciclo de vida. Tendrás una excepción si intentas resolver un componente por alcance de vida que coincide cuando no hay un alcance de por vida correctamente nombrado. (Si se analiza el ciclo de vida de la etiqueta no guardada, ocurrirá una excepción.)
Instancia por solicitud
Algunos tipos de aplicación tienen naturalmente una semántica de tipo "solicitud", como ASP.NET MVC. Entre estos tipos de solicitud, es útil tener algún tipo de "singleton por solicitud". Instancia por solicitud se construye sobre instancia por alcance de por vida que coincida proporcionando una etiqueta de alcance de por vida bien conocida, un método de conveniencia de registro e integración para aplicaciones comunes tipos (una instancia por solicitud se construye sobre el alcance de por vida correspondiente proporcionando una etiqueta de por vida bien conocida, un método de conveniencia de registro e integración para tipos de aplicaciones comunes). Básicamente, es por el alcance de la vida que corresponde.
Esto significa que si no hay una solicitud actual y analizas un componente registrado según instancia por solicitud, se lanzará una excepción. Hay una sección detallada de preguntas frecuentes que explica cómo trabajar con vidas por solicitud.
El inicio de sesión del hipervínculo es visible.
Instancia por propiedad
Propiedad del tipo de relación implícita, creando un nuevo ciclo de vida anidado. Las dependencias pueden limitarse a la instancia anfitriona registrándose con instancia-per-owned.
En este ejemplo, el servicio ServiceForHandler tendrá alcance a la vida útil de la instancia MessageHandler propietaria.
Alcance de Hilos
Puedes consultarlo
El inicio de sesión del hipervínculo es visible.
Combate real
Estoy usando el modo Instancia Por Alcance de por Vida.
En winform, cuando se ejecuta la llamada, se utiliza un contexto de base de datos cada vez, como se muestra en la figura siguiente:
_dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 _dbContext.GetHashCode();
13583655 En el caso de multihilo y concurrencia, si usas el mismo contexto de base de datos, encontrarás excepciones al añadir, eliminar, modificar o revisar la base de datos.
Quiero que autofac devuelva un objeto nuevo cada vez que hago clic en el botón, el código es el siguiente:
Como se muestra a continuación:
(Fin) |