c# - AddAllTypesOf vs ConnectImplementationsToTypesClosing
asp.net-mvc dependency-injection (1)
Advertencia: no he usado StructureMap en un proyecto comercial desde hace varios años. Las cosas pueden haber cambiado desde entonces, pero su código de ejemplo parece completamente familiar, así que supongo que no ha cambiado mucho.
La única razón por la que soy consciente de dónde querrá favorecer a uno sobre el otro es cuando desea definir explícitamente las convenciones que se usarán para asignar implementaciones concretas a T
Ambos pueden hacerlo pero la robustez de la implementación difiere.
Si usa ConnectImplementationsToTypesClosing<T>
, durante la configuración de Scan()
pasa una clase de convención que hereda de IRegistrationConvention
. Para mí, al menos, funcionó sin problemas.
AddAllTypesOf<T>
supuestamente tiene una funcionalidad similar a través de ITypeScanner
pero en la práctica tuvimos todo tipo de problemas extraños, como registros de tipo duplicado, tipos que no se registran si están en un espacio de nombres diferente de T
, y con frecuencia no encontramos las implementaciones específicas que se suponían . Todos estos problemas desaparecieron al usar ConnectImplementationsToTypesClosing<T>
.
Si no está tratando de hacer algo demasiado inteligente y las convenciones predeterminadas funcionan para usted, no debe notar ninguna diferencia entre los dos. Si necesita anular las convenciones predeterminadas por cualquier motivo, yo preferiría que ConnectImplementationsToTypesClosing<T>
.
Tengo curiosidad por la diferencia entre estos dos métodos. Estoy implementando un patrón de decorador con genéricos abiertos y si uso AddAllTypesOf
o ConnectImplementationsToTypesClosing
, no importa el AddAllTypesOf
, obtengo la misma funcionalidad.
public class CommandRegistry : Registry
{
public CommandRegistry()
{
For<CommandProcessor>().Use<DefaultCommandProcessor>().Transient();
Scan(scanner =>
{
scanner.AssemblyContainingType<SaveCoolCommandHandler>();
//scanner.AddAllTypesOf(typeof(CommandHandler<>));
//scanner.AddAllTypesOf(typeof(IValidator<>));
//scanner.AddAllTypesOf(typeof(LogMehh<>));
scanner.ConnectImplementationsToTypesClosing(typeof(CommandHandler<>));
scanner.ConnectImplementationsToTypesClosing(typeof(IValidator<>));
scanner.ConnectImplementationsToTypesClosing(typeof(LogMehh<>));
});
var handlerType = For(typeof(CommandHandler<>));
handlerType.DecorateAllWith(typeof(CommandValidator<>)); //Second
handlerType.DecorateAllWith(typeof(CommandLogger<>)); //First
// ObjectFactory.WhatDoIHave();
}
}
La llamada a ObjectFactory.WhatDoIHave()
también me da los mismos resultados independientemente del método que elija.
He mirado el código fuente y estos métodos definitivamente hacen cosas diferentes, simplemente no he podido determinar exactamente cuál es la diferencia. ¿Existen pautas o escenarios cuando se prefiere uno sobre el otro?