Когда вы регистрируете несколько типов, которые реализуют один и тот же интерфейс, последний выигрывает.
builder.RegisterType<FluentFtpFileHandler>().As<IFileHandler>();
builder.RegisterType<LocalFileHandler>().As<IFileHandler>();
var container = builder.Build();
var handler = container.Resolve<IFileHandler>();
// handler is going to be LocalFileHandler
// because LAST IN WINS.
Если вам нужно разрешить разные обработчики в разных ситуациях, это своего рода запах кода, потому что вы на самом деле не можетеотноситься ко всем обработчикам одинаково. На этом есть FAQ, который объясняет, с примерами, почему это не так здорово, но также дает некоторые идеи для обхода.
Возвращаясь к ситуации с декоратором, я бы рекомендовал попробовать новый синтаксис декоратора , поскольку он менее запутан, чем классический синтаксис.
builder.RegisterType<FluentFtpFileHandler>().Named<IFileHandler>("ftpHandler");
builder.RegisterType<LocalFileHandler>().Named<IFileHandler>("localHandler");
builder.RegisterDecorator<LogDecoerator, IFileHandler>();
var container = builder.Build();
var handler = container.ResolveNamed<IFileHandler>("ftpHandler");
// Handler should be a decorated instance of the FTP handler.
Я запускаю его с помощью своего ментального компилятора "уверен, что это должно работать", поэтому, если синтаксис небуквально копируй / вставляй туда, извини за это.