Skip to content

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.

public sealed class OpenDecoratorForAttribute : System.Attribute

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.

public OpenDecoratorForAttribute(System.Type openGenericServiceType);

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.

public System.Type OpenGenericServiceType { get; }

Property Value

System.Type

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.

public int Order { get; set; }

Property Value

System.Int32

Remarks

When multiple decorators exist for the same open generic interface, they are applied in order from lowest to highest Order value.