2010-01-25 15 views
5

W moim rejestrze mamStructureMap: Jak ustawić cykl na typów związanych z ConnectImplementationsToTypesClosing

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

Co mam zrobić, aby określić je wszystkie jako singletons?

Również jako odpowiedź na to pytanie, czy istnieje jakikolwiek powód, aby nie definiować wszystkiego, co jest bezpaństwowe, jako obiekt singletonowy zarejestrowany w StructureMap?

Odpowiedz

11

Odpowiedź Kevina jest poprawna dla wersji 2.5.4 i starszych. W aktualnej magistrali StructureMap (i gdy 2.5.5+ jest wydane), możesz teraz:

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

bardzo ładne dodane polecane, nie mogę się doczekać 2.5.5! –

+0

Przełączono odpowiedź na to, aby lepiej odpowiadać obecnym czasom. –

1

Metoda skanera montażowego ConnectImplementationsToTypesClosing używa aplikacji IRegistrationConvention, aby wykonać zadanie. Aby to zrobić, skopiowałem i zaktualizowałem ogólny skaner połączeń StructureMap, aby uzyskać również zakres. Następnie stworzyłem poręczną metodę rozszerzenia skanera montażowego do użycia jako syntaktycznego cukru do podłączenia go.

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)); 
    } 
} 

Oto odpowiedni kod konfiguracji.

Scan(scanner => 
    { 
     scanner.ConnectImplementationsToSingletonTypesClosing(typeof(IValidation<>)); 
    }); 

Mam nadzieję, że to pomoże.

+0

To zdecydowanie wygląda na rozwiązanie, jest głupie, że trzeba to zrobić na coś tak prostego, ale to wygląda bardzo podobnie do posta, który widziałem na grupie SM wcześniej, myślę, że Jeremy mógłby dodać sposób, aby określić, że bez potrzeby implementowania własnej konwencji w wersji 2.5.5, a teraz widząc twój post, ma sens, o co chodzi. –

+0

Niestety nie widziałem tego wpisu. Pracuję z Jeremym. Aby stworzyć moje rozwiązanie, po prostu chwyciłem źródło StructureMap i zorientowałem się, w jaki sposób to zrobił i dostosowałem je do twoich potrzeb. Może skorzystać z nieco większej elastyczności lub lepszej integracji z DSL konfiguracji SM, ale to pozwoli ci na razie. Cieszyć się. – KevM