2010-01-25 5 views
5

Nel mio registro hoStructureMap: Come impostare il ciclo di vita sui tipi connessi ConnectImplementationsToTypesClosing

Scan(scanner => 
     { 
      scanner.AssemblyContainingType<EmailValidation>(); 
      scanner.ConnectImplementationsToTypesClosing(typeof(IValidation<>)); 
     }); 

cosa dovrei fare per definire questi tutti come Singletons?

Inoltre, a parte questa domanda, c'è qualche ragione per non definire tutto ciò che è stateless come un oggetto singleton registrato in StructureMap?

risposta

11

La risposta di Kevin è corretta per le versioni 2.5.4 e precedenti. Nel bagagliaio StructureMap corrente (e quando viene rilasciato 2.5.5+), ora è possibile farlo:

Scan(scanner => 
{ 
    scanner.AssemblyContainingType<EmailValidation>(); 
    scanner.ConnectImplementationsToTypesClosing(typeof(IValidation<>)) 
      .OnAddedPluginTypes(t => t.Singleton()); 
}); 
+0

aggiunto molto bello, non vedo l'ora per 2.5.5! –

+0

Cambia la risposta a questo per essere più in linea con i tempi correnti. –

1

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.

+0

Questo appare decisamente come una soluzione, è muto questo deve essere fatto per qualcosa di così semplice, tuttavia questo sembra molto simile a un post che ho visto sul gruppo SM in precedenza, penso che Jeremy potrebbe aggiungere un modo per specificarlo senza la necessità di implementare la propria convenzione in 2.5.5 e ora vedere il tuo post ha molto senso di cosa si trattasse. –

+0

Spiacente, non ho visto quel post. Lavoro con Jeremy. Per creare la mia soluzione ho appena preso la fonte StructureMap e ho capito come lo stava facendo e adattato secondo la tua richiesta. Potrebbe trarre vantaggio da una maggiore flessibilità o da una migliore integrazione con la configurazione DSL di SM, ma per ora è tutto a portata di mano. Godere. – KevM

Problemi correlati