Il metodo dello scanner di assieme ConnectImplementationsToTypesClosing utilizza un IRegistrationConvention per portare a termine il lavoro. Per fare questo ho copiato e aggiornato lo scanner di connessione generica StructureMap per prendere anche un ambito. Successivamente ho creato un pratico metodo di estensione dello scanner di assemblaggio da usare come zucchero sintattico per collegarlo.
public class GenericConnectionScannerWithScope : IRegistrationConvention
{
private readonly Type _openType;
private readonly InstanceScope _instanceScope;
public GenericConnectionScannerWithScope(Type openType, InstanceScope instanceScope)
{
_openType = openType;
_instanceScope = instanceScope;
if (!_openType.IsOpenGeneric())
{
throw new ApplicationException("This scanning convention can only be used with open generic types");
}
}
public void Process(Type type, Registry registry)
{
Type interfaceType = type.FindInterfaceThatCloses(_openType);
if (interfaceType != null)
{
registry.For(interfaceType).LifecycleIs(_instanceScope).Add(type);
}
}
}
public static class StructureMapConfigurationExtensions
{
public static void ConnectImplementationsToSingletonTypesClosing(this IAssemblyScanner assemblyScanner, Type openGenericType)
{
assemblyScanner.With(new GenericConnectionScannerWithScope(openGenericType, InstanceScope.Singleton));
}
}
Ecco il codice di installazione appropriato.
Scan(scanner =>
{
scanner.ConnectImplementationsToSingletonTypesClosing(typeof(IValidation<>));
});
Spero che questo aiuti.
aggiunto molto bello, non vedo l'ora per 2.5.5! –
Cambia la risposta a questo per essere più in linea con i tempi correnti. –