StructureMap: Как установить жизненный цикл на типах, соединенных с ConnectImplementationsToTypesClosing

В моем реестре я имею

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

Что я, как предполагается, делаю для определения их всех как Одиночные элементы?

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

6
задан Austin Salonen 5 June 2013 в 21:01
поделиться

2 ответа

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

Scan(scanner =>
{
   scanner.AssemblyContainingType<EmailValidation>();
   scanner.ConnectImplementationsToTypesClosing(typeof(IValidation<>))
          .OnAddedPluginTypes(t => t.Singleton());
});
12
ответ дан 8 December 2019 в 18:36
поделиться

Способ сборки Сканер «Подключение». Для этого я скопировал и обновил общий сканер структуры 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<>));
     });

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

1
ответ дан 8 December 2019 в 18:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: