Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

372
Vistas
Unity: cambiar el administrador de por vida predeterminado para registros implícitos y/o deshabilitarlos

El contenedor de Unity resolverá automáticamente cualquier tipo que pueda resolver por sí mismo sin necesidad de registro manual. Eso es bueno de alguna manera, pero el problema que tengo es que usa un TransientLifetimeManager para este tipo de resolución, mientras que casi siempre quiero un ContainerControlledLifetimeManager . Todavía puedo registrar mis tipos como singletons manualmente, por supuesto, pero si lo olvido, en lugar de obtener una excepción no controlada al inicio, la aplicación se iniciará correctamente y todo parecerá funcionar. Pero eventualmente habrá errores, posiblemente muy sutiles, difíciles de diagnosticar, debido al hecho de que hay múltiples instancias de un tipo que se supone que es único.

Entonces, mi pregunta es: ¿hay alguna manera de que pueda especificar un administrador de por vida predeterminado diferente o deshabilitar completamente el comportamiento predeterminado de resolución automática y limitar el contenedor a los tipos que registré yo mismo (directamente o según mis propias convenciones)?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

¿Hay alguna manera de que pueda especificar un administrador de por vida predeterminado diferente?

Sí, puede usar una extensión de contenedor que usará un administrador de por vida diferente. Consulte Solicitud de administrador de vida útil predeterminado configurable para ver un ejemplo.

o deshabilite completamente el comportamiento predeterminado de resolución automática y limite el contenedor a los tipos que registre yo mismo

Sí, una extensión de contenedor también puede hacer esto.

Primero, durante el registro explícito, registre la BuildKey del registro. Luego, antes de crear el objeto, verifique si BuildKey se registró explícitamente.

 public class RegistrationTrackingExtension : UnityContainerExtension { private ConcurrentDictionary<NamedTypeBuildKey, bool> registrations = new ConcurrentDictionary<NamedTypeBuildKey, bool>(); protected override void Initialize() { base.Context.Registering += Context_Registering; base.Context.Strategies.Add( new ValidateRegistrationStrategy(this.registrations), UnityBuildStage.PreCreation); } private void Context_Registering(object sender, RegisterEventArgs e) { var buildKey = new NamedTypeBuildKey(e.TypeTo, e.Name); this.registrations.AddOrUpdate(buildKey, true, (key, oldValue) => true); } public class ValidateRegistrationStrategy : BuilderStrategy { private ConcurrentDictionary<NamedTypeBuildKey, bool> registrations; public ValidateRegistrationStrategy(ConcurrentDictionary<NamedTypeBuildKey, bool> registrations) { this.registrations = registrations; } public override void PreBuildUp(IBuilderContext context) { if (!this.registrations.ContainsKey(context.BuildKey)) { Exception e = new Exception("Type was not explicitly registered in the container."); throw new ResolutionFailedException(context.BuildKey.Type, context.BuildKey.Name, e, context); } } } }

Luego agregue la extensión, registre algunas clases y resuelva. Si la clase no se registró explícitamente, se lanzará una excepción.

 IUnityContainer container = new UnityContainer(); // Add container extension container.AddNewExtension<RegistrationTrackingExtension>(); // Register types container.RegisterType<MyClass>(); container.RegisterType<IMyClass, MyClass>(); container.RegisterType<IMyClass, MyClass>("A"); // These succeed because they were explicitly registered container.Resolve<IMyClass>(); container.Resolve<IMyClass>("A"); container.Resolve<MyClass>(); // MyClass2 was not registered so this will throw an exception container.Resolve<MyClass2>();
over 4 years ago · Santiago Trujillo Denunciar

0

Probé la extensión DefaultLifetimeManeger pero de alguna manera no funcionó. (¿Quizás Unity ha cambiado?). De todos modos, si no desea utilizar una extensión, también puede utilizar la función RegsiterByConvention.

 container.RegisterTypes(AllClasses.FromLoadedAssemblies(), WithMappings.None, WithName.Default, x => new DisposingTransientLifetimeManager());

Esto registrará todas las clases con el "DisposingTransientLifetimeManager" que elegí usar como predeterminado. Tenga en cuenta que debe hacer esto al comienzo de sus registros, ya que todos los registros sobrescribirán cualquier registro anterior del mismo tipo y nombre.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda