Поскольку я не мог придумать правильного решения, чтобы узнать, какие декораторы настроены напрямую, я пришел к решению моего "регистратора":
public interface IDecoratorRegistrar
{
void RegisterGenericDecorator(ContainerBuilder builder, Type decoratorType, Type serviceType);
void RegisterGenericDecorator(ContainerBuilder builder, Type decoratorType, Type serviceType);
void RegisterDecorator(ContainerBuilder builder, Type decoratorType, Type serviceType);
void RegisterDecorator(ContainerBuilder builder, Type decoratorType, Type serviceType, Func<IDecoratorContext, bool>? condition);
}
Это фактическая реализация для Autofa c регистрации:
public class DecoratorRegistrar : IDecoratorRegistrar
{
public void RegisterGenericDecorator(ContainerBuilder builder, Type decoratorType, Type serviceType)
{
RegisterGenericDecorator(builder, decoratorType, serviceType, null);
}
public void RegisterGenericDecorator(ContainerBuilder builder, Type decoratorType, Type serviceType, Func<IDecoratorContext, bool>? condition)
{
builder.RegisterGenericDecorator(decoratorType, serviceType, condition);
}
public void RegisterDecorator(ContainerBuilder builder, Type decoratorType, Type serviceType)
{
RegisterDecorator(builder, decoratorType, serviceType, null);
}
public void RegisterDecorator(ContainerBuilder builder, Type decoratorType, Type serviceType, Func<IDecoratorContext, bool>? condition)
{
builder.RegisterDecorator(decoratorType, serviceType, condition);
}
}
Реализация модульных тестов:
public class MockDecoratorRegistrar : IDecoratorRegistrar
{
public IList<(Type decoratorType, Type serviceType)> Decorators { get; } = new List<(Type decoratorType, Type serviceType)>();
public IList<(Type decoratorType, Type serviceType)> GenericDecorators { get; } = new List<(Type decoratorType, Type serviceType)>();
public void RegisterDecorator(ContainerBuilder builder, Type decoratorType, Type serviceType)
{
Decorators.Add((decoratorType, serviceType));
}
public void RegisterDecorator(ContainerBuilder builder, Type decoratorType, Type serviceType, Func<IDecoratorContext, bool>? condition)
{
Decorators.Add((decoratorType, serviceType));
}
public void RegisterGenericDecorator(ContainerBuilder builder, Type decoratorType, Type serviceType)
{
GenericDecorators.Add((decoratorType, serviceType));
}
public void RegisterGenericDecorator(ContainerBuilder builder, Type decoratorType, Type serviceType, Func<IDecoratorContext, bool>? condition)
{
GenericDecorators.Add((decoratorType, serviceType));
}
}
Чтобы зарегистрировать декоратор, я сейчас вызываю:
decoratorRegistrar.RegisterGenericDecorator(containerBuilder, typeof(ActionCommandHandlerExceptionDecorator<>), typeof(IActionCommandHandler<>));
decoratorRegistrar
является экземпляром DecoratorRegistrar
или MockDecoratorRegistrar
в модульных тестах.
В моих модульных тестах я теперь могу легко проверить регистрации, позвонив:
mockDecoratorRegistrar.GenericDecorators.Should().Contain(item => item.decoratorType == expectedType);
Эта абстракция решает мои фактические вопрос. Тем не менее: если у кого-то есть решение для доступа к регистрации Decorator непосредственно из Autofa c, сообщите мне.