Autofac: Как зарегистрировать несколько типов с одним и тем же интерфейсом для использования с декоратором? - PullRequest
0 голосов
/ 22 февраля 2019

Я не вижу, как регистрировать и разрешать типы с одним и тем же интерфейсом для использования с декоратором.Чтобы получить разрешение с помощью декоратора и тех же экземпляров ILogger и IConfiguration, я объявляю их так:

builder.RegisterType<FluentFtpFileHandler>().Named<IFileHandler>("fileHandler");
builder.RegisterType<LocalFileHandler>().Named<IFileHandler>("fileHandler");
builder.RegisterDecorator<IFileHandler>((c, inner) =>
    new LogDecorator(inner.Logger, inner.Configuration, inner), fromKey: "fileHandler");

Внутри фабричного класса, как я могу разрешить, например, экземпляр FluentFtpFileHandler?

1 Ответ

0 голосов
/ 22 февраля 2019

Когда вы регистрируете несколько типов, которые реализуют один и тот же интерфейс, последний выигрывает.

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.

Я запускаю его с помощью своего ментального компилятора "уверен, что это должно работать", поэтому, если синтаксис небуквально копируй / вставляй туда, извини за это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...