Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

380
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda