В моем реестре я имею
Scan(scanner =>
{
scanner.AssemblyContainingType<EmailValidation>();
scanner.ConnectImplementationsToTypesClosing(typeof(IValidation<>));
});
Что я, как предполагается, делаю для определения их всех как Одиночные элементы?
Также как в стороне к этому вопросу, там какая-либо причина не состоит в том, чтобы определить все, что является не сохраняющим состояние, поскольку одиночный элемент возражает, что это регистрируется в StructureMap?
Ответ Кевина верен для версии 2.5.4 и старше. В текущем стволе StructureMap (а когда выйдет 2.5.5+) теперь можно сделать:
Scan(scanner =>
{
scanner.AssemblyContainingType<EmailValidation>();
scanner.ConnectImplementationsToTypesClosing(typeof(IValidation<>))
.OnAddedPluginTypes(t => t.Singleton());
});
Способ сборки Сканер «Подключение». Для этого я скопировал и обновил общий сканер структуры 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<>));
});
Надеюсь, это поможет.