2016-07-13 4 views
0

"plugins"폴더에서 어셈블리를로드하고 일부 구현을 동적으로 등록합니다. Autofac + OWIN 서비스 해결 문제

builder.RegisterAssemblyTypes(asms) 
     .Where(t => typeof(IValidator).IsAssignableFrom(t)) 
     .AsClosedTypesOf(typeof(IValidator<>)); 

builder.RegisterAssemblyTypes(asms) 
     .Where(t => typeof(IService).IsAssignableFrom(t) && t.IsClass) 
     .AsImplementedInterfaces() 
     .AsSelf(); 

그냥 내가 모든 등록 로그 확인하기 :

var appPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 
var pluginsPath = Path.Combine(appPath, path); 

var asmfiles = Directory.EnumerateFiles(pluginsPath, "*.dll", SearchOption.AllDirectories);    

foreach(var asmfile in asmfiles) 
{ 
    Assembly.LoadFile(asmfile); 
} 

모든 어셈블리를로드 한 후, 나는 서비스 등록을 진행

container.ComponentRegistry 
     .Registrations 
     .SelectMany(x => x.Services) 
     .Select(x => x.Description) 

2016-07-13 09:58:52.5673 TRACE: Registered services: 
    Services.Test.ITestService 
    ServiceModel.IService 
    Services.Test.TestService 
2016-07-13 09:58:52.5673 TRACE: Registered validators: 
    TestRequestValidator 

문제를 Autofac 수 없어 생성자에 ITestService 종속성을 가진 컨트롤러를 만드는 것처럼 보입니다.

"type": "Autofac.Core.DependencyResolutionException", 
    "message": "None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'ApiHostService.Controllers.EchoController' can be invoked with the available services and parameters: Cannot resolve parameter 'Services.Test.ITestService testService' of constructor 'Void .ctor(Services.Test.ITestService)'.", 

무엇이 문제 일 수 있습니까?

편집 : 컨테이너에서 해결이 실패합니다.

+1

무슨 일이 직접 컨테이너에서 ITestService를 해결하려고 할 때? –

+0

해결되지 않습니다. – Raine

답변

1

Assembly.LoadFile (asmfile)을 실행할 때 같은 ID로 어셈블리를 두 번로드 할 수 있습니다. 이로 인해 해결하려는 ITestService (프로젝트 참조에있는 ITestService)가 컨테이너에로드 한 ITestService (별도의 어셈블리로로드 된 ITestService)와 다릅니다.

대신 Assembly.LoadFrom(asmfile)을 사용해주세요. 로딩 중복없이 당신이 원하는 Difference between LoadFile and LoadFrom with .NET Assemblies?

또한 달성이 어셈블리의 프리 로더를 사용할 수 있습니다 :

이 질문을 참조 https://github.com/zidad/net-tools/blob/master/src/Net.Core/Reflection/AssemblyPreloader.cs

+0

AssemblyPreloader 클래스는 매우 유용했습니다. :) 결국 런타임에 ApiControllers를 빌드하고 중재자를 사용하여 요청을 올바른 핸들러로 전달하기로 결정했습니다. 몇 가지 변경 사항을 적용한 후에는 모든 것이 작동하지만 문제가 무엇인지 확신 할 수 없습니다. – Raine

+1

@Raine 기쁜 마음으로 당신은 그걸 달릴 수 있다고 들었습니다! –