Я относительно новый пользователь как для Autofac, так и для ASP.NET Core. Недавно я перенес небольшой проект из «классического» проекта ASP.NET WebAPI в ASP.NET Core. У меня возникают проблемы с Autofac, особенно при регистрации родовых типов.Ошибка регистрации типичных типов с Autofac в ASP.NET Core
Этот проект использует шаблон Command, каждый обработчик команд является закрытым родовое как
public class UpdateCustomerCommandHandler: ICommandHandler<UpdateCustomerCommand>
Эти обработчики команд инъецируют в контроллеры, такие как:
readonly private ICommandHandler<UpdateCustomerCommand> _updateCustomerCommand;
public ValuesController(ICommandHandler<UpdateCustomerCommand> updateCustomerCommand)
{
_updateCustomerCommand = updateCustomerCommand;
}
Autofac сконфигурирован (частично) в качестве :
var builder = new ContainerBuilder();
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
//This doesn't seem to be working as expected.
builder.RegisterAssemblyTypes(assemblies)
.As(t => t.GetInterfaces()
.Where(a => a.IsClosedTypeOf(typeof(ICommandHandler<>)))
.Select(a => new KeyedService("commandHandler", a)));
Выше, похоже, не регистрируется t он общий, как ожидалось. Если я использую метод ниже для регистрации, он работает хорошо.
builder.RegisterType<UpdateCustomerCommandHandler>().As<ICommandHandler<UpdateCustomerCommand>>();
Когда я говорю «Это не работает», что я имею в виду, что при попытке создать экземпляр контроллера, я получаю «InvalidOperationException: Не удается разрешить услугу типа«BusinessLogic.ICommandHandler`1 [BusinessLogic. UpdateCustomerCommand] 'при попытке активировать' AutoFac_Test.Controllers.ValuesController '. "
Это хорошо работало в полной версии WebAPI этого проекта, но не после его воссоздания в ASP.NET Core. Чтобы быть ясным, это отлично работало перед переносом на ASP.NET Core.
Вот ссылка на код, который я использовал, чтобы воссоздать этот вопрос: https://dl.dropboxusercontent.com/u/185950/AutoFac_Test.zip
**** ИЗМЕНИТЬ ПОСЛЕ РЕШЕНИЯ НАЙДЕННЫХ ****
Там не было ничего на самом деле не так с моя конфигурация Autofac и, конечно, не сам Autofac. Случилось так, что я переименовал вывод моих зависимых сборок, чтобы сделать сборку для сканирования (замена AppDomain.CurrentDomain.GetAssemblies()
более элегантной, однако я никогда не изменял зависимости проекта API для ссылки на новые сборки. Таким образом, Autofac сканировал правильно загруженные узлы, которые случились быть более старыми версиями, которые не содержат интерфейсы и реализации я ожидал ...
Возможного дубликатом [Могу ли я сделайте ключевую услугу для AutoFac на основе типа Open Generic] (http://stackoverflow.com/questions/13636492/can-i-make-a-keyed-service-for-autofac-based-on-the- type-of-the-the-open-generic) – Tseng
Спасибо за предложение, но этот вопрос не является дубликатом этого. В этом случае реквестер хотел зарегистрировать общий вывод из конкретной базы и реализовать определенный закрытый общий интерфейс. В моем случае я просто хочу зарегистрировать реализации конкретного закрытого общего интерфейса. Более того, вышеприведенный синтаксис доказал свою эффективность в классическом ASP.NET, но не в ASP.NET Core. Мне интересно, изменилось ли что-то в размышлении, которое могло бы вызвать это? – QuietSeditionist