Die Assembly-Scanner-Methode ConnectImplementationsToTypesClosing verwendet eine IRegistrationConvention, um die Aufgabe zu erledigen. Dazu habe ich den generischen Connection Scanner von StructureMap kopiert und aktualisiert, um auch einen Bereich zu nutzen. Als nächstes habe ich eine praktische Assembly-Scanner-Erweiterungsmethode erstellt, um sie als syntaktischen Zucker zu verwenden.
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));
}
}
Hier ist der entsprechende Setup-Code.
Scan(scanner =>
{
scanner.ConnectImplementationsToSingletonTypesClosing(typeof(IValidation<>));
});
Hoffe das hilft.
sehr schön hinzugefügt, kann nicht auf 2.5.5 warten! –
Switched die Antwort auf diese, um mehr in Einklang mit den aktuellen Zeiten. –