Autofac egyik képessége, hogy magától tudja a decorator osztályokat kezelni.
builder.RegisterDecorator<LogDecorator, INotificationSender>();
A decorator pattern-ről részletesebben itt lehet olvasni: https://refactoring.guru/design-patterns/decorator
Amikor egy olyan példányt kérünk az autofac-tól, amihez tartozik dekorátor, akkor azt automatikusan “elé” teszi. Természetesen itt is működik az a megoldás, hogy ha több megvalósítást regisztrálunk majd, amikor gyűjteményt kérünk, akkor az összes megvalósítást egy-egy hozzá tartozó dekorátor példánnyal kapjuk meg.
builder.RegisterType<EmailSender>().As<INotificationSender>().InstancePerRequest();
builder.RegisterType<SmsSender>().As<INotificationSender>().InstancePerRequest();
public class Operation : IOperation
{
public Operation(IEnumerable<INotificationSender> senderCollection)
{
...
}
}
Egy módosítás miatt, viszont Az autofac 5.1.x verzióknál minden megvalósítás egy közös dekorátor példányt kap egy scope-on belül. Ez páldául akkor tudd kellemetlen meglepetést okozni, amikor a dekorálandó osztály bármelyik tulajdonságát magának a dekorátornak is beállítjuk (maga az interfész megköveteli). Ilyenkor ugyanis az először elkészített osztályhoz tartozó értékkel példányosított dekorátort kapja meg mindegyik megvalósítás.
Nézzük az alábbi példát:
public enum NotificationType
{
Email,
SMS
}
public interface INotificationSender
{
NotificationType NotificationType { get; }
void Send(SendNotificationDto sendNotificationDto);
}
public class NotificationDecorator : INotificationSender
{
private readonly INotificationSender _notificationSender;
public NotificationType NotificationType { get; }
public NotificationDecorator(INotificationSender notificationSender)
{
_notificationSender = notificationSender;
NotificationType = notificationSender.NotificationType;
}
public void Send(SendNotificationDto sendNotificationDto)
{
...
_notificationSender.Send(sendNotificationDto);
...
}
}
Ebben az esetben minden megvalósítás az email tulajdonsággal rendelkező dekorátort fogja kapni.
Szerencsére ez az Autofac 5.2.0. verziótól ismét a megszokott módon működik.