OpenDecoratorForAttribute
NexusLabs.Needlr.Generators¶
OpenDecoratorForAttribute Class¶
Marks a generic class as a decorator for all closed implementations of an open generic interface. This is a source-generation only feature - the generator discovers all closed implementations at compile time and emits decorator registrations for each.
Inheritance System.Object 🡒 System.Attribute 🡒 OpenDecoratorForAttribute
Example¶
public interface IHandler<T>
{
Task HandleAsync(T message);
}
// Concrete handlers
public class OrderHandler : IHandler<Order> { ... }
public class PaymentHandler : IHandler<Payment> { ... }
// Open generic decorator - applies to ALL IHandler<T> implementations
[OpenDecoratorFor(typeof(IHandler<>))]
public class LoggingDecorator<T> : IHandler<T>
{
private readonly IHandler<T> _inner;
private readonly ILogger<LoggingDecorator<T>> _logger;
public LoggingDecorator(IHandler<T> inner, ILogger<LoggingDecorator<T>> logger)
{
_inner = inner;
_logger = logger;
}
public async Task HandleAsync(T message)
{
_logger.LogInformation("Handling {Type}", typeof(T).Name);
await _inner.HandleAsync(message);
_logger.LogInformation("Handled {Type}", typeof(T).Name);
}
}
// Generator emits:
// services.AddDecorator<IHandler<Order>, LoggingDecorator<Order>>();
// services.AddDecorator<IHandler<Payment>, LoggingDecorator<Payment>>();
Remarks¶
Use this attribute when you want to apply a single decorator implementation to ALL
closed types of an open generic interface. For example, to add logging to every
IHandler<T> implementation.
The decorated class must: - Be an open generic class with matching type parameter arity - Implement the open generic interface specified - Accept the open generic interface as a constructor parameter (to wrap the inner service)
At compile time, the source generator:
1. Discovers all closed implementations of the open generic interface
2. Emits AddDecorator<TService, TDecorator> for each closed type
Constructors¶
OpenDecoratorForAttribute(Type) Constructor¶
Initializes a new instance of the OpenDecoratorForAttribute class.
Parameters¶
openGenericServiceType System.Type
The open generic interface type to decorate (e.g., typeof(IHandler<>)).
Must be an open generic interface.
Properties¶
OpenDecoratorForAttribute.OpenGenericServiceType Property¶
Gets the open generic interface type that this decorator wraps.
Property Value¶
OpenDecoratorForAttribute.Order Property¶
Gets or sets the order in which this decorator is applied relative to other decorators for the same service. Lower values are applied first (closer to the original implementation). Default is 0.
Property Value¶
Remarks¶
When multiple decorators exist for the same open generic interface, they are applied in order from lowest to highest Order value.