StructureMap: как установить жизненный цикл для типов, связанных с ConnectImplementationsToTypesClosing - PullRequest
6 голосов
/ 25 января 2010

В моем реестре у меня есть

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

Что я должен сделать, чтобы определить их как синглтоны?

Также, помимо этого вопроса, есть ли причина не определять все, что не имеет состояния, как одноэлементный объект, зарегистрированный в StructureMap?

Ответы [ 2 ]

12 голосов
/ 30 января 2010

Ответ Кевина верен для версий 2.5.4 и старше. В текущей магистрали StructureMap (и когда выпущено 2.5.5+), вы можете сделать:

Scan(scanner =>
{
   scanner.AssemblyContainingType<EmailValidation>();
   scanner.ConnectImplementationsToTypesClosing(typeof(IValidation<>))
          .OnAddedPluginTypes(t => t.Singleton());
});
1 голос
/ 25 января 2010

Метод сканера сборки ConnectImplementationsToTypesClosing использует IRegistrationConvention для выполнения работы. Для этого я скопировал и обновил общий сканер соединений StructureMap, чтобы также использовать область видимости. Затем я создал удобный метод расширения сканера сборки, который можно использовать в качестве синтаксического сахара для подключения.

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

Вот соответствующий код настройки.

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

Надеюсь, это поможет.

...