저는 Autofac과 ASP.NET Core의 비교적 새로운 사용자입니다. 저는 최근에 '클래식'ASP.NET WebAPI 프로젝트에서 ASP.NET 코어로 작은 프로젝트를 이식했습니다. Autofac에 문제가 있습니다. 특히 제네릭 유형을 등록하는 것이 좋습니다. Autofac 같이 (부분적으로) 구성된다ASP.NET 코어에서 Autofac으로 제네릭 유형을 등록 할 때 문제가 발생했습니다.
readonly private ICommandHandler<UpdateCustomerCommand> _updateCustomerCommand;
public ValuesController(ICommandHandler<UpdateCustomerCommand> updateCustomerCommand)
{
_updateCustomerCommand = updateCustomerCommand;
}
:
이 프로젝트는 각 명령어 핸들러는
public class UpdateCustomerCommandHandler: ICommandHandler<UpdateCustomerCommand>
이러한 명령어 핸들러
같은 컨트롤러에 주입 같은 폐쇄 총칭, 명령 패턴을 사용 :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 그는 예상대로 일반. 등록을 위해 아래의 방법을 사용하면 잘 작동합니다. 'BusinessLogic.ICommandHandler`1 [BusinessLogic 유형의 서비스를 확인할 수 없습니다 :
builder.RegisterType<UpdateCustomerCommandHandler>().As<ICommandHandler<UpdateCustomerCommand>>();
나는 "그것은 작동하지 않습니다"라고
는, 내 말은 컨트롤러의 인스턴스를 시도 할 때, 나는 "InvalidOperationException이를 얻을 수 있다는 것입니다. UpdateCustomerCommand] '를 실행하는 동안'AutoFac_Test.Controllers.ValuesController '이 기능은이 프로젝트의 Full WebAPI 버전에서 잘 작동하지만 ASP.NET Core에서 다시 제작 한 후에는 작동하지 않습니다. 분명한 것은 ASP.NET 코어로 포팅하기 전에 완벽하게 작동하는 것입니다. 여기
내가이 문제를 다시 사용했던 코드에 대한 링크입니다 : https://dl.dropboxusercontent.com/u/185950/AutoFac_Test.zip**** 발견 해결 AFTER 편집 ****
잘못된 사실 아무것도 없었다 내 Autofac 구성 및 Autofac 자체가 아닙니다. 무슨 일이 있었는지, 어셈블리를 스캔하기 위해 내 종속 어셈블리의 결과를 바꿨다는 것입니다. (AppDomain.CurrentDomain.GetAssemblies()
을 더 우아하게 바꾸었지만 API 어셈블리의 종속성을 새 어셈블리를 참조하도록 수정하지 않았습니다.) 그래서 Autofac은 무슨 일이 있었 올바르게로드 어셈블리는
가능한 복제 내가 할 수있다 -
당신이 decorators 사용하는 경우, 길을 등록 작업이 당신은 장식이 키으로 적용 할 수있는 서비스를 정의 오픈 Generic의 유형에 따라 AutoFac에 키 서비스를 제공하십시오. "(http://stackoverflow.com/questions/13636492/can-i-make-a-keyed-service-for-autofac-based-on-the- open-generic) – Tseng
제안에 감사드립니다. 그러나이 질문은 그와 중복되지 않습니다. 이 경우 요청자는 특정 기반에서 일반 파생을 등록하고 특정 폐쇄 일반 인터페이스를 구현하려고했습니다. 내 경우에는 특정 폐쇄 된 일반 인터페이스의 구현을 등록하려고합니다. 게다가, 위의 구문은 고전적인 ASP.NET에서는 꽤 잘 작동하지만 ASP.NET 코어에서는 제대로 작동하지 않는 것으로 입증되었습니다. 이 문제를 일으킬 수있는 리플렉션이 변경된 것인지 궁금합니다. – QuietSeditionist